顶层的接口Collection接口和Map接口
1.collection下有三个常用的实现类:list、set、vector(list和set都是线程不安全的,效率高,对数据的查询快。而vector是线程安全的,效率低)。
1.1 arraylist容器是底层是一个object类型的数组,我们所知道的自动扩容其实就是一个方法,对每一次向数组中添加对象的时候都会进行一次判断,当当前的要添加的对象位置的数值大于等于当前对象数组的容量时,就进行扩容。简单实现的方法是
package com.src.test;
public class MyArrayList {
private Object[] obj;
private int size;
public MyArrayList() {
this(10);
}
public MyArrayList(int i) {
if (i <= 0) {
try {
throw new Exception();
} catch (Exception e) {
e.getStackTrace();
}
}
obj = new Object[i];
}
public void add(Object o) {
if (size >= obj.length) {
Object[] array = new Object[size * 2];
System.arraycopy(obj, 0, array, 0, obj.length);
obj = array;
}
obj[size++] = o;
}
public Object get(int index) {
if (index < 0 || index >= size) {
try {
throw new Exception();
} catch (Exception e) {
e.getStackTrace();
}
}
return obj[index];
}
public void remove(int index) {
int removeIndex = size - index - 1;
System.arraycopy(obj, index + 1, obj, index, removeIndex);
}
}
其中的set,get,add方法实现说到底就是对数组的添加和删除等,contain则是遍历obj数组对其中的每一个值进行判断。如果有则返回true,没有则返回false。
这其中的关键是构造方法是个关键,无参的构造方法会调用一个有参数的构造方法,进行初始的obj空间大小的赋值。每一次添加的时候都会进行判断容量是否够。
1.2 linkedlist的关键我认为是组合的运用,在linkedlist类中有其他的类,Node(节点)。
private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { transient int size = 0; transient Node<E> first; transient Node<E> last; public LinkedList() { } private void linkFirst(E e) { final Node<E> f = first; final Node<E> newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; } public boolean add(E e) { linkLast(e); return true; }
在linkendlist中有三个基本属性,first node,last node和size,Node类中有三个属性,previous node,next node 和Object obj。分别是上一个节点下一个节点和盛放属性的object对象。
2.Map下有有两个常用的实现类:hashmap,hashtable。
2.1 这其中的关键是用空间换时间。建立索引。