Java ArrayList 底層以陣列儲存元素,陣列長度固定。當加入元素超過容量時,ArrayList 會自動建立更大的新陣列,並將舊資料複製過去,這就是「動態擴容」的本質。
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)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
| 步驟 | 說明 |
|---|---|
| 1. 計算新容量 | 預設為舊容量的 1.5 倍(oldCapacity + oldCapacity/2)。 |
| 2. 邊界檢查 | 若 1.5 倍仍不夠,直接用所需最小容量;若超過 MAX_ARRAY_SIZE (Integer.MAX_VALUE - 8),則呼叫 hugeCapacity 處理。 |
| 3. 複製陣列 | 呼叫 Arrays.copyOf,底層為 System.arraycopy,屬淺層複製。 |
add 平均 O(1)。new ArrayList<>(initialCapacity) 減少擴容次數。ArrayList 的「動態」是靠陣列複製實現的假象。理解擴容機制有助於寫出高效能的 Java 程式碼,避免頻繁擴容造成的 GC 壓力。