Java中的常用容器底层分析及实现

 

Collection的子类有List,Set
 

List的子类ArrayList(底层实现是数组),LinkedList(底层是链表),Vector(底层是数组)

1.ArrayList的底层方法实现:
package collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class MyArrayList {
public MyArrayList() {
private Object[] elementData;
int size;
public MyArrayList(int initialCapacity) {
elementData = new Object[] {};
}
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
if (initialCapacity >= 0) {elementData = new Object[initialCapacity];
return size;
} else {}}public int size() {}
public void add(int index,Object obj) {
public void add(Object obj) {
ensureCapacityInternal(size+1);
elementData[size++] = obj;}
public Object get(int index) {
ensureCapacityInternal(size+1);//注意这个移动数据的方法
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = obj;size++;}
Object[] newobj = new Object[size*2+1];
return elementData[index];
}//扩容原理
public void ensureCapacityInternal(int capacity) {
if(capacity>elementData.length) {
if(index >= size) {
System.arraycopy(elementData, 0, newobj, 0, size);
elementData =newobj;}}
//此处设置合情合理,因为数的小标》=0;
public void rangecheck(int index) {throw new RuntimeException();
public void set(int index,Object obj) {
}
}
public void rangeCheckForAdd(int index) {
if(index < 0 || index >= size) {
//ArrayList的实现中不能往后设定元素吗?
throw new RuntimeException();}}rangecheck(index);
return false;
elementData[index] = obj;
}
return size == 0;
public boolean isEmpty() {}
public boolean contains(Object obj) {
int index = indexOf(obj);if(index == -1) {}return true;
if(elementData[i] == null) {
}//有点意思
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}public int indexOf(Object obj) {
for(int i = 0;i < size;i++) {
if(null == obj) {return i;}}}else{
System.arraycopy(elementData, index+1, elementData, index, size-index-1);
for(int i = 0;i < size;i++) {
if(elementData[i] .equals(obj)) {
return i;}}}
public void remove(int index) {
return -1;} rangecheck(index);
}
elementData[size-1] = null; size--;
System.out.println(list.size);
public void remove(Object obj) {
int index = indexOf(obj);
remove(index);
if(index != -1) {}}
MyArrayList list = new MyArrayList();
public static void main(String[] args) {list.add("1");
}
list.add(2);list.add(3);
System.out.println(list.get(1));
//System.out.println(list.get(-1));
list.remove(0);
list.remove(0);
System.out.println(list.size);
System.out.println(list.get(0));
}


 

package collection;

//LinkedList的底层实现是链表,增删改快,查询慢,
public class MyLinkedList {
	private int size;
	private Node first;
	private Node last;

	public int size() {
		return size;
	}

	public void add(Object obj) {
		if (first == null) {
			first = new Node();
			first.previous = null;
			first.content = obj;
			last =first ;
			first.next = last;
		} else {
			Node node = new Node();
			last.next = node;
			node.content = obj;
			node.previous = last;
			last = node;
		}
		size++;

	}

	public void addFirst(Object obj) {
		Node node = new Node();	
		if(first==null) {
			first = node;
			first.previous = null;
			first.content = obj;
			last= first;
			first.next = last;
						
		}else{
			first.previous = node;	
			node.content = obj;
			node.next = first;
			node.previous = null;
			first = node;		
		}
		size++;

	}
	public void addLast(Object obj){
		
		if(last ==null) {
			addFirst(obj);
		}else {
			Node node = new Node();
			last.next = node;
			node.previous = last;
			node.content = obj;
			last = node;
			size++;
		}
		
		
		
	}
	public Node getNode(int index) {
		Node temp = new Node();
		temp = first;
		for(int i = 0;i < index;i++) {
			temp = temp.next;
		}
		return temp;
	}
	public Object get(int index) {
		
		return getNode(index).content;
	}
	 public void set(int index,Object obj) {
		 Node node = getNode(index);
		 node.content = obj;
	 }
	 public int indexOf(Object obj) {
		 Node temp = first;
		 if(obj == null) {
			 for(int i = 0;i < size;i++) {
				 if( temp.content == obj) {
					 return i;
				 }else {
					 temp = temp.next;
				 }
			 }
			 return -1;
		 }else {
			 for(int i = 0;i < size;i++) {
				 if( temp.content.equals(obj) ) {
					 return i;
				 }else {
					 temp = temp.next;
				 }
			 }
			 return -1;
		 }
		
		
	 }
	 public boolean contains(Object obj) {
		// return indexOf(obj) ==-1? true:false;
		 return indexOf(obj)!=-1;
	 }
	 public void remove(Object obj) {
		 Node temp = first;
		 if(obj==null) {
			 for(int i = 0;i < size;i++) {
				 if( temp.content == obj) {
					 temp.previous.next = temp.next;
					 temp.next.previous = temp.previous;
					 size--;
					 break;
				 }else {
					 temp = temp.next;
				 }
			 }
		 }else {
			 for(int i = 0;i < size;i++) {
				 if( temp.content.equals(obj) ) {
					 if(temp==first) {
						
						first =  first.next;
						first.previous = null;
						 size--;
						 break;
					 }else {
						 temp.previous.next = temp.next;
						 temp.next.previous = temp.previous;
						 size--;
						 break;
					 }
					
				 }else {
					 temp = temp.next;
				 }
			 }
			
		 }
	 }
	 public void clear() {
		 if(size !=0) 
		 {
			 Node temp = first;
			 for(int i = 0;i < size;i++) {
				
				Node node =temp.next;
				temp.content = null;
				temp = null;
				node.previous = null;
				temp = node;
				 
			 }
		 }
		 size = 0;
		 
	 }

	public static void main(String[] args) {
		MyLinkedList list = new MyLinkedList();
		list.add(1);
		System.out.println(list.get(0));
		list.add(2);
		System.out.println(list.get(1));
		list.add(3);
		System.out.println(list.get(2));
		list.addFirst(4);
		System.out.println(list.get(0));
		list.addLast(5);
		System.out.println(list.get(4));
		System.out.println(list.indexOf(1));
		list.remove(4);
		System.out.println(list.size);
		list.clear();
		System.out.println(list.size);
		System.out.println(list.get(0));
		
		
		
	}
}

 

package collection;

public class Node {
	Node previous;
	Object content;
	Node next;
	
}

 

package collection;
//hashmap的底层实现是数组+链表
public class MyHashMap {
	private int size;
	MyLinkedList arr[] = new MyLinkedList[999];//在这里不考虑扩容的事了
	
	public void put(Object key,Object value) {
		
		int num = key.hashCode()%arr.length;//恰到好处的运用hashcode;
		if(arr[num]==null) {
			MyLinkedList linkedlist = new MyLinkedList();
			arr[num] = linkedlist;
			Entry entry = new Entry(key, value);
			linkedlist.add(entry);
			
			size++;
		}else {
			for(int i = 0;i < arr[num].size();i++) {
				Entry entry = (Entry)arr[num].get(i);
				if(entry.key.equals(key)) {
					entry.value = value;
					return;
				}
			}
			Entry entry = new Entry(key, value);
			arr[num].add(entry);
			size++;
			
		}
	}
	public Object get(Object key) {
		int num = key.hashCode()%arr.length;
		if(arr[num]!=null) {
			
			for(int i = 0;i < arr[num].size();i++) {
				Entry en = (Entry) arr[num].get(i);
				if(en.key.equals(key)) {
					return en.value;
				}
			}
		}
		return null;
		
	}
	public int size() {
		return size;
	}
	public static void main(String[] args) {
		MyHashMap map = new MyHashMap();
	/*	map.put("a", "a1");
		map.put("b", "b1");
		map.put("a", "a2");
		System.out.println(map.get("a"));
		System.out.println(map.get("b"));
		System.out.println(map.size());*/
		Student stu1 = new Student("张三", 18);
		Student stu2 = new Student("李四", 19);
		Student stu3 = new Student("张三", 20);
		map.put(stu1, "男");
		map.put(stu2, "女");
		map.put(stu1, "女");
		System.out.println(map.size);
		System.out.println(map.get(stu1));
		
	}
	private class Entry{
		Object key;
		Object value;
		public Entry(Object key, Object value) {
			super();
			this.key = key;
			this.value = value;
		}
		
	}
}
class Student{
	private String name;
	private int age;
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}

 

package collection;

import java.util.HashMap;
//由此可见HashSet集合的不可重复完全依赖于HashMap键的不可重复实现的
public class MyHashSet {
	private HashMap hashmap;
	 private static final Object PRESENT = new Object();
	public MyHashSet() {
		hashmap = new HashMap<>();
	}
	public int size() {
		return hashmap.size();
	}
	public boolean isEmpty() {
		return hashmap.isEmpty();
	}
	public boolean contains(Object obj) {
		return hashmap.containsKey(obj);
	}
	public void clear() {
		hashmap.clear();
	}
	public void add(Object obj) {
		hashmap.put(obj, PRESENT);
	}
	
}

 

package knowledgepoint;

import java.util.TreeSet;

//TreeSet注意:在添加数据时排序,数据更改不会影响原来的顺序,因此里面的数据可能有重复的。
//因此使用TreeSet时要保证数据不能修改(有必要时加final)
public class TreeSetDemol {
	public static void main(String[] args) {
		TreeSet<Worker> treeset = new TreeSet<>();
		treeset.add(new Worker("工人", 10000));
		Worker w = new Worker("教师",5000);
		treeset.add(w);
		treeset.add(new Worker("程序员", 20000));
		treeset.add(new Worker("修理工", 8000));
		System.out.println(treeset);
		w.setType("修理工");
		w.setSalary(8000);
		System.out.println(treeset);//由此验证了可重复性,因此本例中最好将属性设为final
		
	}
}
class Worker implements Comparable<Worker>{
	private String type;
	private double salary;
	public Worker(String type,double salary) {
		this.type = type;
		this.salary = salary;
	}
	@Override
	public int compareTo(Worker o) {
		
		return this.type.compareTo(o.type);
	}
	@Override
	public String toString() {
		return "Worker [type=" + type + ", salary=" + salary + "]";
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	
	
}

TreeMap要求键能够排序就行了 ,其余和TreeSet基本一致。

 

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值