transient Object[] elementData; // 非私有,便於內部類訪問
Object[]。| 版本 | 擴容公式 | 特點 |
|---|---|---|
| JDK 1.6 及之前 | newCapacity = (oldCapacity * 3)/2 + 1 | 乘法運算,增長 1.5 倍 + 1 |
| JDK 1.7+ | newCapacity = oldCapacity + (oldCapacity >> 1) | 位移運算 (oldCapacity * 1.5),無 +1,性能更優 |
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);
}
MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8(機器相關)。hugeCapacity() 處理超大數組邊界情況。Arrays.copyOf 內部調用 System.arraycopy(native 快速複製)。elementData 聲明為 Object[],而非 E[]。泛型 E 僅在編譯期檢查,運行期擦除為 Object。這就是為什麼不能創建泛型數組(new E[10] 非法)的原因。
new ArrayList<>(initialCapacity) 避免頻繁擴容複製。ensureCapacity()。? extends/? super)。