listiterator 是 list 专属双向迭代器,支持前后遍历及遍历中增删改元素;内部用游标定位,初始在索引 0 前,next() 正向、previous() 反向;仅通过 list.listiterator() 获取,可指定起始索引;修改操作线程安全,不抛 concurrentmodificationexception。

ListIterator 是 Java 中 List 接口专属的迭代器,它支持**双向遍历**(向前和向后),还能在遍历过程中**添加、删除、修改元素**,这是普通 Iterator 不具备的能力。
为什么 ListIterator 能双向遍历?
它内部维护一个游标(cursor)位置,指向当前元素的“前一个”或“后一个”逻辑位置,并提供两组方向明确的方法:
-
向前遍历:用
next()和hasNext()—— 从头开始,逐个访问后续元素; -
向后遍历:用
previous()和hasPrevious()—— 从当前位置倒退,访问前面的元素。
注意:初始时游标在索引 0 之前(即“开头左侧”),所以首次调用 next() 返回第 0 个元素,而首次调用 previous() 会抛出 NoSuchElementException(因为前面没元素)。
如何获取并使用 ListIterator?
只能通过 List 实例的 listIterator() 方法获得(Collection 或数组不支持):
List<string> list = new ArrayList(Arrays.asList("a", "b", "c"));
ListIterator<string> lit = list.listIterator(); // 从开头开始
// 正向走一遍
while (lit.hasNext()) {
System.out.print(lit.next() + " "); // 输出:a b c
}
System.out.println();
// 此时游标已在末尾(索引3位置),可直接反向遍历
while (lit.hasPrevious()) {
System.out.print(lit.previous() + " "); // 输出:c b a
}</string></string>
支持从指定位置开始双向遍历
调用 list.listIterator(int index) 可将游标初始化到指定索引处(即指向该索引元素的“前一个”位置):
-
list.listIterator(1)→ 游标在索引 1 前,next()返回索引 1 元素("b"),previous()返回索引 0 元素("a"); - 索引必须满足
0 ≤ index ≤ list.size(),越界抛IndexOutOfBoundsException。
遍历中安全地修改集合
不同于普通 Iterator,ListIterator 的修改操作不会导致 ConcurrentModificationException(只要由它自己触发):
-
add(E e):在游标当前位置前插入元素,插入后游标位于新元素之后; -
set(E e):替换上一次next()或previous()返回的元素; -
remove():删除上一次next()或previous()返回的元素(每个元素只能删一次)。
例如:遍历时把所有 "b" 替换为 "B",再在末尾加 "end":
ListIterator<string> lit = list.listIterator();
while (lit.hasNext()) {
String s = lit.next();
if ("b".equals(s)) lit.set("B");
}
lit.add("end"); // 在末尾插入</string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











