ArrayList添加
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
elementData[size++] = e :e為傳入的需要存儲的元素,elementData 是ArrayList中存放元素的數組緩存區,當ArrayList初始化時長度為0,當存放第一個元素時,長度為10
/** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA * will be expanded to DEFAULT_CAPACITY when the first element is added. */ transient Object[] elementData; // non-private to simplify nested class access
ensureCapacityInternal(size + 1) :size為ArrayList的長度,表示當前集合中的元素數量
private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); }
private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }
minCapacity:表示最小容量,calculateCapacity()方法中邏輯:如果向集合中添加元素時elementData為長度為零的數組,則設置為初始容量為DEFAULT_CAPACITY=10
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }
modCount:修改次數,判斷使用最小容量減去當前數組的長度是否大於零,如果大於零則表示需要擴容,反之當前容量不需要擴容
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
grow()為擴容方法,傳入當前容量值,獲取當前數組緩存區的長度,根據當前緩沖區長度進行計算擴容,擴容的數量是當前緩存區長度的1.5倍。最后使用Arrays.copyOf方法進行數組擴容