增强for循环遍历LinkedList最简洁安全,底层用Iterator且性能优于索引访问;需删除元素时须用Iterator.remove();反向遍历或插入应选ListIterator;避免用普通for+get(i)因时间复杂度O(n)。

用增强for循环遍历 LinkedList 最简洁
只要不修改集合结构(如删除、插入元素),for-each 是最安全、最易读的方式。它底层调用 iterator(),但屏蔽了迭代器细节。
- 适用于只读遍历,代码行数最少
- 不能在遍历时调用
remove()或add(),否则抛ConcurrentModificationException - 对
LinkedList来说,性能不如普通for索引访问?错——因为LinkedList的get(int)是 O(n),而iterator是 O(1) 逐个移动,所以for-each实际更快
LinkedListlist = new LinkedList<>(Arrays.asList("a", "b", "c")); for (String s : list) { System.out.println(s); // 输出 a, b, c }
用 Iterator 手动控制遍历时删除元素
需要边遍历边删元素时,必须用 Iterator 并调用其 remove() 方法。直接调用 list.remove(obj) 会触发快速失败机制。
-
Iterator.remove()是唯一安全的遍历中删除方式 - 不能连续调用两次
remove()(会抛IllegalStateException) - 注意:
LinkedList.iterator()返回的是ListIterator子类,支持双向遍历,但普通Iterator接口已够用
Iteratorit = list.iterator(); while (it.hasNext()) { String s = it.next(); if ("b".equals(s)) { it.remove(); // 安全删除 } }
用 ListIterator 反向遍历或插入元素
当需要从尾到头遍历,或在遍历中往当前节点前插入元素时,ListIterator 是唯一选择。它比普通 Iterator 多出 hasPrevious()、previous() 和 add() 方法。
-
list.listIterator(list.size())得到指向末尾的迭代器,适合反向遍历 -
add()插入后,新元素成为下一次next()的目标,不影响当前迭代位置 - 注意:
ListIterator的add()不是线程安全的,多线程下仍需同步
ListIteratorlit = list.listIterator(list.size()); while (lit.hasPrevious()) { System.out.println(lit.previous()); // 输出 c, b, a(如果未删) }
避免用普通 for + get(i) 遍历 LinkedList
for (int i = 0; i 看似自然,但在 LinkedList 上是严重性能陷阱。
立即学习“Java免费学习笔记(深入)”;
-
LinkedList.get(i)需要从头或尾开始逐个跳转节点,平均时间复杂度 O(n/2),整个循环变成 O(n²) - 换成
ArrayList就没问题,因为它是数组实现,get(i)是 O(1) - IDE(如 IntelliJ)通常会对这种写法标黄警告:“Loop can be replaced with enhanced for loop”
真要用索引访问,请先确认你用的是 ArrayList;如果是 LinkedList,就别碰 get(i) 做遍历。










