集合底层源码
Collection
List
ArrayList
public abstract class AbstractList<E>{ //操作数 protected transient int modCount = 0;//1 } public class ArrayList<E> extends AbstractList<E> implements List<E>{ //空数组的实例(长度为0的数组实例) private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //空数组的实例(长度为0的数组实例) private static final Object[] EMPTY_ELEMENTDATA = {}; //元素的容器 transient Object[] elementData; //new Object[10] //元素个数(指针) private int size;//10 //默认初始化容量 private static final int DEFAULT_CAPACITY = 10; //数组最大容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } public boolean add(E e) { ensureCapacityInternal(size + 1);//判断是否扩容 elementData[size++] = e; return true; } //minCapacity - 11 private void ensureCapacityInternal(int minCapacity) { //使用无参构造创建ArrayList时,第一次添加元素时进入此判断 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } //minCapacity - 11 private void ensureExplicitCapacity(int minCapacity) { modCount++; //目的扩容长度必须比数组长度大 if (minCapacity - elementData.length > 0) grow(minCapacity);//扩容的方法 } //minCapacity - 11 private void grow(int minCapacity) { //oldCapacity - 10 int oldCapacity = elementData.length; //newCapacity - 15 int newCapacity = oldCapacity + (oldCapacity >> 1);//ArrayList扩容机制 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE; } }
场景:
ArrayList<String> list = new ArrayList<>(); list.add("麻生希"); list.add("椎名空"); list.add("爱田奈奈"); list.add("三上悠亚");
LinkedList
public abstract class AbstractList<E>{ //操作数 protected transient int modCount = 0; } public abstract class AbstractSequentialList<E> extends AbstractList<E> { } public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>{ //元素个数 transient int size = 0; //第一个节点 transient Node<E> first;//null //最后一个节点 transient Node<E> last;//null public LinkedList() {} public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size&#