List 繼承 Collection,新增有序、可重複、支援索引特性,所有角標相關方法均為 List 特有。
| 分類 | 方法簽名 | 說明 |
|---|---|---|
| 添加 | void add(int index, E element) | 指定位置插入,後續元素右移 |
boolean addAll(int index, Collection extends E> c) | 指定位置批量插入 | |
| 刪除 | E remove(int index) | 刪除指定位置,返回被刪元素,後續元素左移 |
| 修改 | E set(int index, E element) | 替換指定位置,返回舊元素 |
| 查詢 | E get(int index) | 獲取指定位置元素 |
List | 返回 [from, to) 視圖,底層共享數組 | |
int indexOf(Object o) / lastIndexOf(Object o) | 首次/最後一次出現索引,不存在返回 -1 | |
| 迭代器 | ListIterator / listIterator(int index) | 雙向迭代器,支援前向/後向、添加、修改 |
import java.util.*;
public class ListDemo {
public static void main(String[] args) {
ArrayList list = new ArrayList<>(Arrays.asList("Java基礎", "集合框架", "多線程"));
System.out.println("原列表: " + list); // [Java基礎, 集合框架, 多線程]
// 1. 指定位置插入
list.add(1, "JVM調優"); // 索引 1 插入
System.out.println("插入後: " + list); // [Java基礎, JVM調優, 集合框架, 多線程]
// 2. 刪除指定位置
String removed = list.remove(2); // 刪除 "集合框架"
System.out.println("刪除: " + removed + " -> " + list); // [Java基礎, JVM調優, 多線程]
// 3. 修改元素
String old = list.set(1, "JVM深度調優");
System.out.println("修改: " + old + " -> " + list.get(1)); // JVM調優 -> JVM深度調優
// 4. 獲取元素
System.out.println("get(0): " + list.get(0)); // Java基礎
// 5. 子列表視圖
List sub = list.subList(0, 2); // [Java基礎, JVM深度調優]
System.out.println("subList: " + sub);
sub.set(0, "Java核心"); // 影響原列表
System.out.println("原列表受影響: " + list.get(0)); // Java核心
// 6. 索引查找
System.out.println("indexOf('多線程'): " + list.indexOf("多線程")); // 2
// 7. 普通 Iterator (單向)
System.out.println("--- Iterator ---");
for (Iterator it = list.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
// 8. ListIterator 雙向 + 修改/添加
System.out.println("--- ListIterator 正向 ---");
ListIterator li = list.listIterator();
while (li.hasNext()) {
String s = li.next();
if ("JVM深度調優".equals(s)) li.set("JVM極致調優"); // 修改
}
System.out.println("--- ListIterator 反向 ---");
while (li.hasPrevious()) {
System.out.println(li.previous()); // 多線程, JVM極致調優, Java核心
}
System.out.println("最終列表: " + list); // [Java核心, JVM極致調優, 多線程]
// 9. 遍歷中安全添加 (僅 ListIterator 支援)
ListIterator li2 = list.listIterator();
while (li2.hasNext()) {
if ("Java核心".equals(li2.next())) li2.add("新增元素");
}
System.out.println("添加後: " + list); // [Java核心, 新增元素, JVM極致調優, 多線程]
}
}
| 特性 | Iterator | ListIterator |
|---|---|---|
| 方向 | 單向 (next) | 雙向 (next/previous) |
| 修改 | remove() | remove() / set() / add() |
| 定位 | 無 | nextIndex() / previousIndex() |
| 獲取方式 | collection.iterator() | list.listIterator() |
| 適用集合 | 所有 Collection | 僅 List |
// ❌ 錯誤:遍歷中直接調用 list.remove()
for (String s : list) { if ("X".equals(s)) list.remove(s); } // 拋 CME
// ✅ 正確:用 Iterator.remove()
Iterator it = list.iterator();
while (it.hasNext()) { if ("X".equals(it.next())) it.remove(); }
// ✅ 正確:用 ListIterator.add/set (僅 List)
ListIterator li = list.listIterator();
while (li.hasNext()) { if ("X".equals(li.next())) li.set("Y"); }
List 接口在 Collection 基礎上增加索引語義,ArrayList 以動態數組實現,隨機訪問 O(1),插入刪除 O(n)。掌握 add/remove/set/get/subList/indexOf/listIterator 九大特有方法,並熟練使用 ListIterator 進行雙向遍歷、安全修改/添加,是高效操作有序集合的核心技能。