標籤:
java.util.ArrayList就是傳說中的動態數組.
繼承了關係,有此可看出ArrayList與list的collection的關係
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
分析期特性
具有執行個體化性質,從實現了serializable就可以看出來
private static final long serialVersionUID = 8683452581122892189L;
接下來定義了初始容量大小,和初始錐形。arralist裡面本身儲存的為一個Object類型的數組
/** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; /** * Shared empty array instance used for empty instances. */ private static final Object[] EMPTY_ELEMENTDATA = {}; private transient Object[] elementData;
使用arraylist時需要執行個體化:有三種
/** * 初始化一個給定大小容量的數組List,主要用於如果本事知道這個list的大小時。 * 能最佳化如果大小超過預設容量時導致arralist每次都要去增加並建立一個新的list * @param initialCapacity the initial capacity of the list * @throws IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } /** * 使用預設的大小10 */ public ArrayList() { super(); this.elementData = EMPTY_ELEMENTDATA; } /** * 根據一個collection來定義一個arralist * * @param c the collection whose elements are to be placed into this list * @throws NullPointerException if the specified collection is null */ public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); }
Arraylist有提供期可能存在過多的空容量時清除處理
public void trimToSize() { modCount++; if (size < elementData.length) { elementData = Arrays.copyOf(elementData, size); } }
另一個知識點。當arraylist新增時如果當前容量已滿時的處理過程
public boolean add(E e) { ensureCapacityInternal(size + 1); // 判斷容量是否超標 elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);// 容量超標情況 } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0)// 如果超標,則處理 grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; // 容量大小 int newCapacity = oldCapacity + (oldCapacity >> 1); //超標增加量計演算法,x+x/2=50%左右 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // 賦值原來的數組,並增加newCapacity個容量 elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
Java.util.ArrayList詳解