ArrayList 是 Java 集合框架中最常用的動態陣列實現,底層由 Object[] 陣列支撐,提供了自動擴容、隨機存取等特性。本文將從核心原理、常用操作、效能調優三個維度深度解析 ArrayList。
ArrayList 實現了 List、RandomAccess、Cloneable、Serializable 介面。內部維護一個 transient Object[] elementData 陣列,預設容量為 10(Java 8+ 延遲初始化)。提供三種構造器:
當 size + 1 > capacity 時觸發 grow(),新容量 = oldCapacity + (oldCapacity >> 1)(1.5 倍)。擴容涉及 Arrays.copyOf() 複製陣列,屬於高成本操作。最佳實踐:預估資料量,使用指定容量構造器。
1. 並發修改異常:多執行緒環境下迭代時修改會拋出 ConcurrentModificationException。解決方案:使用 Collections.synchronizedList()、CopyOnWriteArrayList 或手動同步。
2. 基本型別裝箱開銷:ArrayList
3. 子列表陷阱:subList() 返回視圖,非獨立副本,操作子列表會影響原列表,且結構修改會導致視圖失效。
// 擴容核心邏輯 (JDK 17)
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
elementData = Arrays.copyOf(elementData, newCapacity);
}
// 快速失效檢查
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
ArrayList 以陣列為基底,提供高效隨機存取與緊湊記憶體佈局,是預設首選 List 實現。掌握擴容機制、避免頭部操作、善用批次 API、注意執行緒安全,即可發揮其最大效能。針對高併發寫入、大量基本型別儲存等特殊場景,可考慮替代方案。