public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable {
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
transient Object[] elementData; // 底層數組
}
關鍵信息:
RandomAccess → 隨機訪問 (get) 極快Cloneable/Serializable → 支持克隆/序列化 (淺拷貝)新容量 = oldCapacity * 3/2 + 1 (約 1.5 倍)。折中空間與時間:避免頻繁擴容或過度浪費。
底層調用 Arrays.copyOf() 進行數組拷貝。
| 優點 | 缺點 |
|---|---|
| 隨機訪問 O(1) 極快 | 中間/頭部插入刪除 O(n) 需大量拷貝 |
| 順序添加 (尾部) O(1) 摩擦 | 頻繁擴容有性能開銷 |
| 內存連續,CPU 緩存友好 | 非線程安全 |
適用場景: 順序添加、隨機訪問多、插入刪除少。
LinkedList 適用: 頻繁頭部/中間插入刪除。
注:尾部操作 ArrayList 反而比 LinkedList 快 (無節點創建開銷)。
List<String> list = Collections.synchronizedList(new ArrayList<>());
if (list instanceof RandomAccess) {
for (int i = 0; i < list.size(); i++) { ... } // 普通 for 循環,快 2 倍
} else {
for (Iterator it = list.iterator(); it.hasNext(); ) { ... } // 迭代器
}
ArrayList 用普通 for,LinkedList 用迭代器 (普通 for 會慢上千倍)。