ListIterator 是 List 专属双向迭代器,支持正反遍历及遍历时增删改元素;其通过游标定位间隙实现双向操作,add/set/remove 安全且不抛 ConcurrentModificationException。

ListIterator 是 Java 中 List 接口专属的迭代器,它支持**双向遍历**(向前和向后),还能在遍历过程中**添加、删除、修改元素**,这是普通 Iterator 不具备的能力。
为什么 ListIterator 能双向遍历?
因为它内部维护一个**游标位置(cursor)**,指向两个相邻元素之间的“间隙”。每次调用 next() 或 previous() 都会移动这个游标,并返回对应方向的元素。游标初始在索引 0 之前,所以第一次 next() 返回索引 0 的元素,第一次 previous() 则会抛出 NoSuchElementException(因为前面没元素)。
正向遍历 + 反向遍历的典型用法
常用组合是先用 next() 正向走一遍,再用 previous() 往回走 —— 这时游标已在末尾,previous() 就能逐个取到倒序元素:
- 获取
ListIterator:调用list.listIterator()(从头开始)或list.listIterator(index)(从指定索引前开始) - 正向走完:
while (lit.hasNext()) lit.next();→ 游标停在末尾(索引size()处) - 反向走:
while (lit.hasPrevious()) System.out.println(lit.previous());
例如:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
立即学习“Java免费学习笔记(深入)”;
ListListIterator
while (lit.hasNext()) lit.next(); // 游标移到末尾
while (lit.hasPrevious()) System.out.print(lit.previous() + " "); // 输出:c b a
边遍历边修改的安全操作
不同于 Iterator,ListIterator 允许在遍历中安全地增删改:
-
add(e):在游标当前位置插入元素(插入后游标在新元素之后) -
set(e):替换上一次next()或previous()返回的元素(必须已调用过且未被后续add或remove影响) -
remove():删除上一次next()或previous()返回的元素(只能删一次,重复调用会抛异常)
注意:这些操作不会导致 ConcurrentModificationException,因为 ListIterator 是 List 的“授权修改通道”。
获取当前索引位置
nextIndex() 返回下一次 next() 将返回元素的索引;previousIndex() 返回下一次 previous() 将返回元素的索引。两者相差 1,且满足:nextIndex() == previousIndex() + 1。初始时 nextIndex() == 0,previousIndex() == -1。

















