null 與重複元素。Collections.synchronizedList() 或 CopyOnWriteArrayList)。| 特性 | ArrayList | LinkedList |
|---|---|---|
| 底層資料結構 | 動態陣列 (Object[]) | 雙向鏈結串列 |
隨機存取 get(index) | O(1) 極快 | O(n) 需遍歷 |
尾端新增 add(E) | 均攤 O(1)(偶爾擴容複製) | O(1) |
| 頭端/中間插入刪除 | O(n) 需搬移元素 | O(1) 僅調整指標(已定位節點) |
| 記憶體額外開銷 | 低(陣列預留空間) | 高(每節點含 prev/next 參考) |
| 實作介面 | List, RandomAccess, Cloneable, Serializable | List, Deque, Cloneable, Serializable |
| 適用場景 | 頻繁隨機讀取、尾端新增、元素量較固定 | 頻繁頭尾增刪、佇列/棧、元素量劇烈波動 |
List<String> al = new ArrayList<>();
al.add("abc");
al.add("abcd");
al.add("abcde");
// 正確:使用 Iterator 移除
Iterator<String> it = al.iterator();
while (it.hasNext()) {
String s = it.next();
if ("abcd".equals(s)) { // 注意:用 equals() 比較字串,而非 ==
it.remove(); // 安全移除,避免 ConcurrentModificationException
}
System.out.println(s);
}
// 結果:abc, abcde
關鍵點:
Iterator.remove(),不可在 for-each 或普通 for 迴圈中直接 list.remove()。equals(),== 比較的是參考位址。new ArrayList<>(100) 減少擴容複製開銷。String[] arr = list.toArray(new String[0])(JDK 11+ 推薦寫法)。List<String> unmodifiable = Collections.unmodifiableList(list) 或 JDK 10+ List.copyOf(list)。CopyOnWriteArrayList(讀多寫少)、Collections.synchronizedList()(一般同步)。ArrayList 擴容策略:newCapacity = oldCapacity + (oldCapacity >> 1)(1.5 倍)。LinkedList 實作 Deque,提供 push()/pop()/peek() 等棧/佇列操作。RandomAccess 標記介面(LinkedList 未實作),供演算法判斷是否適合隨機存取優化。