List list = Arrays.asList("Java", "Python", "Go", "Rust");
for (int i = 0; i < list.size(); i++) {
String item = list.get(i);
System.out.println(item);
}
O(1)get(i) 為 O(n) 導致整體 O(n²)for (String item : list) {
System.out.println(item);
}
ConcurrentModificationException)、不可替換元素Iterator it = list.iterator();
while (it.hasNext()) {
String item = it.next();
System.out.println(item);
// 安全移除
if ("Go".equals(item)) it.remove();
}
remove())、支持泛型ListIterator lit = list.listIterator();
while (lit.hasNext()) {
int index = lit.nextIndex();
String item = lit.next();
System.out.println(index + ": " + item);
}
// 逆向遍歷
while (lit.hasPrevious()) {
System.out.println(lit.previous());
}
nextIndex()/previousIndex()、add()/set() 修改// 內部迭代,聲明式
list.forEach(System.out::println); // 簡單消費
list.stream().filter(s -> s.startsWith("J")).forEach(System.out::println); // 過濾
list.parallelStream().forEach(System.out::println); // 並行(無序)
| 方式 | ArrayList (ms) | LinkedList (ms) | 備註 |
|---|---|---|---|
| for 索引 | ~15 | ~45000 | LinkedList get(i) 為 O(n) |
| for-each | ~18 | ~22 | 均委託 Iterator |
| Iterator | ~18 | ~22 | 基準性能 |
| ListIterator | ~20 | ~24 | 略高開銷 |
| forEach (Lambda) | ~22 | ~26 | Lambda 開銷 |
| Stream 串行 | ~30 | ~35 | 管道開銷 |
| parallelStream | ~12 (8核) | ~40000 | LinkedList 不支持高效分割 |
結論:ArrayList 首選索引 for 或 for-each;LinkedList 必須用迭代器/for-each;並行流僅適合隨機訪問集合。
| 錯誤場景 | 後果 | 正確做法 |
|---|---|---|
for-each 中 list.remove() | ConcurrentModificationException | 用 Iterator.remove() 或反向索引 for |
| for 索引正向刪除 | 跳過元素/索引越界 | 反向 for (i = size-1; i>=0; i--) |
| 並發修改未同步 | 數據不一致/CME | 用 CopyOnWriteArrayList 或加鎖/並發集合 |
| Stream 中 break | 無法跳出 | 用 takeWhile() (JDK 9+) 或傳統循環 |
| Lambda 捕獲非 final 變量 | 編譯錯誤 | 變量實際最終不可變,或用數組/AtomicReference 包裝 |
需要索引嗎?
├─ 是 → ArrayList: 索引 for / LinkedList: ListIterator
└─ 否
遍歷中需刪除/修改結構?
├─ 是 → Iterator.remove() / ListIterator.add()/set()
└─ 否
純讀取、簡單邏輯?
├─ 是 → for-each (最推薦)
└─ 否 (複雜過濾/轉換/聚合)
└─ Stream API (filter/map/collect)
並行計算、CPU 密集?
└─ parallelStream (確認隨機訪問集合)
Java List 遍歷無絕對最優,核心原則:ArrayList 用索引 for/for-each,LinkedList 用迭代器/for-each,遍歷中改結構用 Iterator/ListIterator,複雜邏輯用 Stream,並行流僅用於隨機訪問集合。理解底層機制(隨機訪問 vs 循序訪問、外部 vs 內部迭代、快速失效),根據場景選擇最適方式。