listiterator 不提供直接获取当前元素索引的方法,因其仅维护光标位置;刚调用 next() 后元素索引为 previousindex(),刚调用 previous() 后为 nextindex()。

Java 的 ListIterator 本身**不提供直接获取“当前元素索引”的方法**,因为它没有“当前元素”的明确概念——它只维护一个**光标位置(cursor)**,这个位置位于两个元素之间(或开头/结尾)。但你可以通过 nextIndex() 或 previousIndex() 间接推导出你刚访问的元素的索引。
理解 ListIterator 的光标模型
ListIterator 的行为像一把“插在缝隙里的尺子”:
- 初始时,光标在索引 0 之前(即
nextIndex() == 0,previousIndex() == -1); - 调用
next()后,返回索引i处的元素,光标移到i+1之前,此时nextIndex() == i+1,previousIndex() == i; - 调用
previous()后,返回索引j处的元素,光标移到j之前,此时previousIndex() == j-1,nextIndex() == j。
✅ 所以:刚通过 next() 取到的元素,其索引 = previousIndex();
刚通过 previous() 取到的元素,其索引 = nextIndex()。
安全获取上一次遍历元素的索引
由于不能“回看”,你需要在调用 next() 或 previous() 后立即记录索引:
List<string> list = Arrays.asList("a", "b", "c");
ListIterator<string> iter = list.listIterator();
while (iter.hasNext()) {
String item = iter.next();
int index = iter.previousIndex(); // ✅ 刚取的 item 就在索引 iter.previousIndex()
System.out.println("元素: " + item + ", 索引: " + index);
}
// 输出:元素: a, 索引: 0;元素: b, 索引: 1;元素: c, 索引: 2
</string></string>
注意边界和异常情况
以下操作会抛出 NoSuchElementException:
- 初始状态就调用
previous()(光标在开头); - 已调用完所有
next()后再调用next(); - 刚调用
next()后立刻连续两次previous()(第二次会越界)。
使用前建议先检查:hasNext()、hasPrevious()。
替代方案:用普通 for 循环或增强 for + 计数器
如果你频繁需要索引,ListIterator 并非最优选择。更直观的方式是:
- 普通 for 循环:
for (int i = 0; i ; - 增强 for + 独立计数器:
int i = 0; for (String e : list) { ... i++; }; - JDK 16+ 可用
IntStream.range(0, list.size()).forEach(i -> {...})。
这些方式索引清晰、不易出错,适合大多数需索引的场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











