ArrayList、LinkedList、HashMap模拟底层实现

ArrayList模拟底层实现


public class MyArrayList <E>{
	private int size;
	private Object[] elementData;
	private final int  DEFAULT_CAPACITY = 10;
	
	public MyArrayList() {
		size = 0;
		elementData = new Object[DEFAULT_CAPACITY];
	}
	
	public MyArrayList (int capacity) {
		if(capacity<0) {
			throw new RuntimeException("MyArrayList容量错误:"+capacity);
		}else if (capacity==0) {
			size = 0;
			elementData = new Object[DEFAULT_CAPACITY];
		}else {
			size = 0;
			elementData = new Object[capacity];
		}
	}
	
	public void add(E obj) {
		if(size == elementData.length) {
			Object[] elementData2 = new Object[size+DEFAULT_CAPACITY>>1];
			System.arraycopy(elementData, 0, elementData2, 0, size);
			elementData = elementData2;
			elementData[size++] = obj;
			size = size+DEFAULT_CAPACITY>>1;
		}else {
			elementData[size++] = obj;
		}
	}
	
	public void set(int index,E obj) {
		checkRange(index);
		elementData[index] = obj;
	}
	
	
	
	
	private void checkRange(int index) {
		if(index<0||index>size-1) {
			throw new RuntimeException("索引越界:"+index);
		}
	}
	
	
	public void remove(int index) {
		checkRange(index);
		int length = size-index-1;
		if(length>0) {
			System.arraycopy(elementData, index+1, elementData, index, length);
			elementData[--size]=null;
		}
	}
	
	@Override
	public String toString() {
		StringBuilder s = new StringBuilder();
		s.append("[");
		for(int i=0;i<size;i++) {
			s.append(elementData[i]).append(",");
		}
		
		s.setCharAt(s.length()-1, ']');
		
		return s.toString();
	}
	
	public static void main(String[] args) {
		MyArrayList<String> arr = new MyArrayList<>();
		arr.add("aa");
		arr.add("bb");
		arr.add("cc");
		System.out.println(arr);
		arr.remove(1);
		System.out.println(arr);
		
	}
}

LinkedList模拟底层实现


class Node{
	Node previous;
	Node next;
	Object element;
	

	public Node(Object element) {
		super();
		this.element = element;
	}
	
	public Node(Node previous, Node next, Object element) {
		super();
		this.previous = previous;
		this.next = next;
		this.element = element;
	}
	
}

public class MyLinkedList <E>{
	private Node first;
	private Node last;
	private int size;
	
	public MyLinkedList() {
		size = 0;
	}
	
	public void add(E obj) {
		Node temp = new Node(obj);
		if(size==0) {
			first = temp;
			last = temp;
		}else {
			last.next = temp;
			temp.previous = last;
			last = temp;
		}
		size++;
	}
	
	public void add(int index,E obj) {
		checkRange(index);
		Node temp = new Node(obj);
		Node node = getNode(index);
		Node up = node.previous;

		if(up!=null) {
			up.next = temp;
			temp.previous = up;
		}
		if(node!=null) {
			node.previous = temp;
			temp.next = node;
		}
		if(index == 0) {
			first = temp;
		}
		if(index == size-1) {
			last = temp;
		}
		size++;
	}
	
	private Node getNode(int index) {
		checkRange(index);
		Node temp = null;
		if(index <= (size-1)<<1) {
			temp = first;
			for(int i=0;i<index;i++) {
				temp = temp.next;
			}
		}
		if(index > (size-1)<<1) {
			temp = last;
			for(int i=size-1;i>index;i--) {
				temp = temp.previous;
			}
		}
		return temp;
	}
	
	public Object get(int index) {
		checkRange(index);
		return getNode(index).element;
	}
	
	private void checkRange(int index) {
		if(index<0||index>size-1) {
			throw new RuntimeException();
		}
	}
	
	public void Remove(int index) {
		checkRange(index);
		Node node = getNode(index);
		Node up = node.previous;
		Node down = node.next;
		node = null;
		
		if(up==null) {
			first = down;
		}else if(down==null) {
			last = up;
		}else {
			up.next = down;
			down.previous = up;
		}
		size--;
		
	}
	
	
	@Override
	public String toString() {
		StringBuilder s = new StringBuilder();
		Node temp = first;
		s.append("[");
		for(int i=0;i<size;i++) {
			s.append(temp.element+",");
			temp = temp.next;
		}
		s.setCharAt(s.length()-1, ']');
		return s.toString();
	}
	
	public static void main(String[] args) {
		MyLinkedList<String> myLinkedlist = new MyLinkedList<String>();
		myLinkedlist.add("aa");
		myLinkedlist.add("bb");
		myLinkedlist.add("cc");
		myLinkedlist.add("dd");
		System.out.println(myLinkedlist);
		myLinkedlist.add(2,"ee");
		System.out.println(myLinkedlist);
		myLinkedlist.Remove(0);
		System.out.println(myLinkedlist);
		myLinkedlist.Remove(3);
		System.out.println(myLinkedlist);
		System.out.println(myLinkedlist.get(2));
		
	}
}

HashMap底层实现


class Node2<K,V>{
	int hash;
	K key;
	V value;
	Node2 next;
	
	
}

public class MyHashMap<K,V> {
	private Node2[] table;
	private int size;
	
	public MyHashMap() {
		table = new Node2[16];
		size = 0;
	}
	
	@Override
	public String toString() {
		StringBuilder s = new StringBuilder();
		s.append("[");
		Node2 temp = null;
		for(int i=0;i<table.length;i++) {
			temp = table[i];
			while (temp!=null) {
				s.append(temp.key+":"+temp.value+",");
				temp = temp.next;
			}
		}
		s.setCharAt(s.length()-1, ']');
		return s.toString();
	}
	
	public int myHash(int h,int length) {
		return h&(length-1);
	}
	
	public void put(K key,V value) {
		Node2 node = new Node2();
		node.hash = myHash(key.hashCode(), table.length);
		node.key = key;
		node.value = value;
		node.next = null;
		Node2 temp = table[node.hash];
		Node2 iteraLast = null;
		boolean isRepeated = false;
		if(temp==null) {
			table[node.hash]=node;
		}else {
			while(temp!=null) {
				if(temp.key.equals(key)) {
					temp.value = value;
					isRepeated = true;
					break;
				}
				iteraLast = temp;
				temp = temp.next;
			}
		
			if (!isRepeated) {
				temp = node;
				iteraLast.next = node;
			}
		}
		size++;
	}
	
	public void  remove(K key) {
		for(int i=0;i<table.length;i++) {
			Node2 temp = table[i];
			Node2 iteraLast = table[i];
			while(temp!=null) {
				if (temp.key.equals(key)) {
					if(temp.next==null) {
						iteraLast.next = null;
						temp.hash = -1;
						temp.key = null;
						temp.value = null;
					}else {
						iteraLast.next = temp.next;
					}
					
				}
				iteraLast =temp;
				temp = temp.next;
			}
		}
		size--;
	}
	
	public Object get(K key) {
		Object value = null;
		for(int i=0;i<table.length;i++) {
			Node2 temp = table[i];
			while(temp!=null) {
				if(temp.key!=null && temp.key.equals(key)) {
					value = temp.value;
				}
				temp = temp.next;
			}
		}
		if (value==null) {
			throw new RuntimeException("找不到键对应的值");
		}
		return value;
	}
	
	public static void main(String[] args) {
		MyHashMap<Integer, String> myHashMap = new MyHashMap<>();
		myHashMap.put(3, "aa");
		myHashMap.put(6, "bb");
		myHashMap.put(9, "cc");
		System.out.println(myHashMap);
		myHashMap.remove(3);
		System.out.println(myHashMap);
		System.out.println(myHashMap.get(6));
	}
}

发布了66 篇原创文章 · 获赞 5 · 访问量 3492

猜你喜欢

转载自blog.csdn.net/weixin_44001681/article/details/104147985