陣列長度固定、類型固定、插入刪除困難。ArrayList 提供動態陣列能力:自動擴容、泛型型別安全、豐富操作 API。
java.lang.Object
↓ java.util.AbstractCollection<E>
↓ java.util.AbstractList<E>
↓ java.util.ArrayList<E>
實作介面:Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
直接子類:AttributeList, RoleList, RoleUnresolvedList
RandomAccess:標記支援快速隨機存取 (O(1) get/set)Serializable:支援序列化傳輸Cloneable:支援淺層複製new ArrayList() // 預設容量 10
new ArrayList(20) // 指定初始容量
new ArrayList(collection) // 從集合複製元素
// JDK 8 核心擴容邏輯 (grow 方法)
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);
}
Arrays.copyOf 為 Native 實作,效能極高| 方式 | 程式碼 | 效能 | 適用場景 |
|---|---|---|---|
| for 索引 | for(int i=0;i<size;i++) list.get(i) | ⭐⭐⭐⭐⭐ 最快 | 高效能、需索引、隨機存取 |
| 增強 for | for(E e : list) | ⭐⭐⭐⭐ 簡潔 | 唯讀遍歷、無需索引 |
| Iterator | for(Iterator it=list.iterator();it.hasNext();) | ⭐⭐⭐ 安全 | 遍歷中需移除元素 |
| ListIterator | for(ListIterator it=list.listIterator();it.hasNext();) | ⭐⭐⭐ 雙向 | 需逆向遍歷、修改、定位 |
| forEach (Java 8) | list.forEach(e -> ...) | ⭐⭐⭐ 函數式 | 配合 Lambda、串流操作 |
List<String> list = new ArrayList<>();
// 新增
list.add("A"); // 尾部新增
list.add(1, "B"); // 指定位置插入
list.addAll(otherList); // 批量新增
// 查詢
String first = list.get(0);
int idx = list.indexOf("A");
boolean has = list.contains("A");
// 修改
list.set(0, "NEW"); // 替換指定位置
// 刪除
list.remove(0); // 按索引刪除
list.remove("A"); // 按物件刪除 (首個)
list.clear(); // 清空
// 截取視圖 (共享底層陣列,謹慎使用)
List<String> sub = list.subList(1, 3);
// 轉陣列
String[] arr = list.toArray(new String[0]); // 推薦寫法
// 容量管理
list.ensureCapacity(100); // 確保最小容量
list.trimToSize(); // 縮減容量至 size
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 隨機存取 get/set | O(1) ⭐ | O(n) |
| 尾部新增 | O(1) 攤銷 | O(1) |
| 頭部/中間插入刪除 | O(n) 陣列搬移 | O(1) 定位後 |
| 記憶體開銷 | 低 (陣列) | 高 (節點物件) |
| 遍歷效能 | 極佳 (CPU 緩存友好) | 較差 (指針跳躍) |
90% 場景首選 ArrayList,除非明確需要頻繁頭部/中間插入刪除且不需隨機存取。
Collections.synchronizedList()、CopyOnWriteArrayList (讀多寫少)、或外部同步