nextindex()和previousindex()反映listiterator游标在元素间的逻辑位置,用于精准插入、双向查找及安全修改;游标不在元素上而在间隙中,修改列表结构必须通过迭代器方法以保证索引准确。

在使用 ListIterator 遍历列表时,nextIndex() 和 previousIndex() 并非只是“返回下标”的简单工具——它们精准反映当前游标(cursor)在元素之间的逻辑位置,是实现插入、条件跳转、双向回溯等复杂操作的关键依据。
理解游标位置的本质
ListIterator 的游标始终位于两个元素之间(或首尾),而非指向某个元素。例如对列表 [A, B, C]:
- 初始状态:游标在索引 0 之前 →
nextIndex() == 0,previousIndex() == -1 - 调用一次
next()后:游标在 A 和 B 之间 →nextIndex() == 1,previousIndex() == 0 - 调用一次
previous()后(回到开头):游标在索引 0 之前 →nextIndex() == 0,previousIndex() == -1
记住:游标位置 = 下一次 next() 将取到的元素索引;previousIndex() = 上一次 previous() 刚取到的元素索引(若未调过 previous(),则为 -1)。
在插入操作中锁定精确位置
当需在满足条件的元素后插入新项,又不能依赖当前元素索引(比如 List 是 LinkedList,随机访问慢),直接用 nextIndex() 最可靠:
ListIterator<string> iter = list.listIterator();
while (iter.hasNext()) {
String s = iter.next();
if ("target".equals(s)) {
// 在 target 元素「之后」插入,即游标当前在 target 和下一个元素之间
// nextIndex() 正是这个位置的索引,add() 会在此处插入
iter.add("newItem"); // 等价于 list.add(iter.nextIndex(), "newItem")
break;
}
}</string>
注意:此时 iter.nextIndex() 返回的是插入点索引,不是 “target” 的索引(那是 iter.previousIndex())。
实现安全的双向查找与定位回退
想从某位置向前找第一个偶数,再向后找第一个大于 100 的数?靠反复调 next()/previous() 易越界。用索引判断更稳:
- 记录起始游标:
int start = iter.nextIndex(); - 向前搜索时,每次
previous()后检查previousIndex() >= 0,避免越界 - 向后搜索时,用
nextIndex() 控制边界 - 定位完成后,可直接用
list.set(iter.previousIndex(), newValue)修改刚找到的元素(前提是刚执行过next()或previous())
规避常见陷阱:修改列表后的索引失效问题
nextIndex() 和 previousIndex() 始终反映**当前迭代器状态**,但列表结构变化会影响后续行为:
- 调用
iter.add(x)后,nextIndex()自动 +1,previousIndex()变为原nextIndex() - 调用
iter.remove()后,nextIndex()和previousIndex()都减 1(因被删元素消失,游标前移) - 但若用
list.add()或list.remove()绕过迭代器修改列表,迭代器会抛ConcurrentModificationException,此时索引值已不可信
结论:所有结构修改必须通过迭代器自身方法(add、remove、set),才能确保 nextIndex()/previousIndex() 持续准确。










