listiterator 比普通 for 或增强 for 更适合边遍历边修改,因其专为 list 设计,维护游标位置,支持 add、set、remove 且不触发 concurrentmodificationexception;而增强 for 底层用普通 iterator,不支持 add,直接 remove 会抛异常。

Java 中用 ListIterator 遍历 List,既能正向、反向迭代,又能在遍历时安全地增删元素,避免 ConcurrentModificationException。
为什么 ListIterator 比普通 for 或增强 for 更适合边遍历边修改
ListIterator 是专为 List 设计的迭代器,它维护当前游标位置(在两个元素之间),所有操作(add、set、remove)都基于该位置,不会破坏底层结构一致性。而增强 for 循环底层用的是普通 Iterator,不支持添加;直接用 list.remove() 会触发快速失败机制,抛出并发修改异常。
如何获取并初始化 ListIterator
调用 list.listIterator() 获取从头开始的迭代器;也可传入索引(如 list.listIterator(3))让游标初始位于索引 3 前(即第 4 个元素之前)。
-
list.listIterator():游标起始位置在索引 0 之前(可立即调用next()) -
list.listIterator(list.size()):游标起始位置在末尾(可立即调用previous())
正向遍历 + 安全修改(add / set / remove)
正向走用 hasNext() + next(),每次调用 next() 后,游标前移一位,此时可安全调用:
-
set(E):替换上一次next()或previous()返回的元素(必须已调用过取值方法) -
remove():删除上一次next()或previous()返回的元素(每个元素只能删一次) -
add(E):在游标当前位置插入新元素(不影响已遍历项,后续next()会返回原下一个元素)
示例:把所有 "apple" 替换为 "orange",并在每个 "banana" 后插入 "mango"
List<string> list = new ArrayList(Arrays.asList("apple", "banana", "cherry", "banana"));
ListIterator<string> iter = list.listIterator();
while (iter.hasNext()) {
String s = iter.next();
if ("apple".equals(s)) {
iter.set("orange");
} else if ("banana".equals(s)) {
iter.add("mango"); // 插入到 banana 之后
}
}
// 结果:["orange", "banana", "mango", "cherry", "banana", "mango"]
</string></string>
反向遍历 + 安全修改
反向走用 hasPrevious() + previous(),逻辑对称:
-
previous()返回前一个元素,游标后退一位 -
set()和remove()仍作用于上一次previous()返回的元素 -
add()仍在当前游标位置插入(即插入到刚返回的元素之前)
注意:add() 在正向和反向中都是“在游标处插入”,语义统一,不因方向改变而变。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











