public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
DEFAULTCAPACITY_EMPTY_ELEMENTDATA爲private static final的Object[],值爲{}數組
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); } }
initialCapacity爲初始化容量
EMPTY_ELEMENTDATA也爲private static final的Object[],值爲{}this
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // c.toArray()可能沒有正確的返回一個Object數組對象 if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // 建立一個空的ArrayList this.elementData = EMPTY_ELEMENTDATA; } }
添加成功返回boolean類型值code
public boolean add(E e) { //字面意思:確保容量存在,計算最小初始容量。 ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
若是這個ArrayList是剛剛初始化好的(容量爲0),則爲默認值:10;若容量不固定,則比較size與10的大小,返回最大值。對象
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // 如今最小容量大小超過如今數組的長度,增加 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//自增1.5倍 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0)//大於MAX_ARRAY_SIZE 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) ? //三元表達式,大於MAX_ARRAY_SIZE取整形最大值 Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;ci
public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); } public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { // 用新的長度建立一個新數組 T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); // 把原數組的內容拷貝到新數組中,並返回新數組 System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }