核心 API 速查表
| 操作類別 | 方法 | 說明 |
| 增 | add(E e) | 尾部添加 |
add(int index, E e) | 指定位置插入,後續元素右移 |
addAll(Collection) | 批量追加 |
addAll(int index, Collection) | 批量插入 |
| 刪 | remove(int index) | 按索引刪除,返回被刪元素 |
remove(Object o) | 按對象刪除首個匹配,返回 boolean |
clear() | 清空列表 |
| 改 | set(int index, E e) | 替換指定位置元素,返回舊值 |
replaceAll(UnaryOperator) | Java 8+ 函數式批量替換 |
| 查 | get(int index) | 按索引獲取 |
indexOf(Object o) | 首次出現索引,無則 -1 |
| lastIndexOf(Object o) | 最後出現索引 |
contains(Object o) | 是否包含 (equals 比較) |
| 子列表 | subList(from, to) | 左閉右開視圖,底層共享數據,結構修改會拋異常 |
| 判空/大小 | isEmpty(), size() | |
| 遍歷 | iterator(), forEach, for-each | 優先 for-each / forEach,需刪除用 Iterator |
| 轉換 | toArray(), toArray(T[]) | 轉數組,建議傳入 new T[0] 或 new T[size] |
| 流式處理 | stream(), parallelStream() | Java 8+ 函數式操作 |
實戰代碼範例
List fruits = new ArrayList<>(List.of("蘋果", "香蕉", "橙子"));
// 1. 增刪改查
fruits.add("葡萄"); // ["蘋果","香蕉","橙子","葡萄"]
fruits.add(1, "芒果"); // ["蘋果","芒果","香蕉","橙子","葡萄"]
String first = fruits.get(0); // "蘋果"
fruits.set(0, "西瓜"); // ["西瓜","芒果","香蕉","橙子","葡萄"]
boolean hasBanana = fruits.contains("香蕉"); // true
int idx = fruits.indexOf("橙子"); // 3
fruits.remove("葡萄"); // 刪除對象
fruits.remove(0); // 刪除索引 0
// 2. 截取子列表 (視圖)
List sub = fruits.subList(1, 3); // [芒果, 香蕉]
// sub.add("新"); // 會導致 ConcurrentModificationException (結構修改)
// 3. 安全轉換為獨立列表
List copy = new ArrayList<>(sub); // 斷開關聯
// 4. 兩列表比較
List a = List.of("A", "B");
List b = List.of("A", "B");
a.equals(b); // true (元素順序相同)
a.hashCode() == b.hashCode(); // true (List hashCode 算法統一)
// 5. 轉數組 (推薦寫法)
String[] arr = fruits.toArray(new String[0]); // JDK 11+ 自動推導大小
// 6. 類型轉換 (流式)
List buffers = fruits.stream()
.map(StringBuffer::new)
.collect(Collectors.toList());
ArrayList vs LinkedList 選型指南
| 場景 | 推薦 | 原因 |
| 頻繁隨機訪問、尾部增刪、遍歷 | ArrayList | 底層數組,緩存友好,get/set O(1) |
| 頻繁頭部/中間增刪、佇列場景 | LinkedList | 雙向鏈表,增刪 O(1) (持有節點引用) |
| 併發環境 | CopyOnWriteArrayList | 寫時復制,讀無鎖,適合讀多寫少 |
常見坑點避雷
subList 返回視圖,對原列表結構修改會失效,需 new ArrayList<>(sub) 斷開。
remove(Object) 依賴 equals(),自定義類必須正確覆寫 equals/hashCode。
- 遍歷中刪除:
for (Iterator it = list.iterator(); it.hasNext(); ) { if (cond) it.remove(); } 或反向 for 循環。
toArray() 無參返回 Object[],不可強轉;必須用 toArray(new T[0])。
Arrays.asList 返回固定大小列表,不可增刪,底層數組修改會反映到列表。