ListIterator 是 Iterator 的子接口,专为 List 设计,支持双向遍历、元素修改(set/add/remove)和获取当前位置索引;通过 list.listIterator() 或 list.listIterator(index) 获取。

Java 中的 ListIterator 是 Iterator 的子接口,专为 List 设计,支持**双向遍历**(向前和向后)、**元素修改**(如 set、add、remove)以及**获取当前位置索引**。它比普通 Iterator 更灵活,但只能用于 List 实现类(如 ArrayList、LinkedList)。
如何获取 ListIterator
调用 List 的 listIterator() 方法即可获得:
-
list.listIterator():从开头开始(光标在索引 0 前) -
list.listIterator(index):从指定位置开始(光标在index元素前)
正向遍历(next 方向)
使用 hasNext() 和 next(),行为类似普通 Iterator:
-
next()返回当前光标后方的元素,并将光标前移一位 -
nextIndex()返回下一次next()将返回的元素索引(即光标当前位置)
示例:
立即学习“Java免费学习笔记(深入)”;
List<String> list = Arrays.asList("a", "b", "c");
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
System.out.println(it.next() + " @ index " + it.previousIndex());
}
输出:a @ index 0、b @ index 1、c @ index 2
反向遍历(previous 方向)
使用 hasPrevious() 和 previous() 向后移动:
-
previous()返回当前光标前方的元素,并将光标后移一位 -
previousIndex()返回下一次previous()将返回的元素索引(即光标前一个位置) - 注意:反向遍历时,
previousIndex()返回的是“将要访问的元素下标”,不是已访问过的
示例(从末尾开始反向):
ListIterator<String> it = list.listIterator(list.size());
while (it.hasPrevious()) {
System.out.println(it.previous() + " @ index " + it.nextIndex());
}
输出:c @ index 2、b @ index 1、a @ index 0
边遍历边修改(安全且精准)
ListIterator 支持在遍历中安全修改列表,不会抛 ConcurrentModificationException:
-
set(E):替换上一次next()或previous()返回的元素 -
add(E):在光标当前位置插入元素(不影响后续next(),但会改变previous()行为) -
remove():删除上一次next()或previous()返回的元素(每个迭代器方法最多调用一次)
例如,把所有 "b" 替换为 "B":
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
String s = it.next();
if ("b".equals(s)) it.set("B");
}
不复杂但容易忽略:ListIterator 的光标始终位于两个元素之间(或首/尾),next() 和 previous() 的行为是对称的,理解光标位置是掌握双向操作的关键。


















