Java中Iterator的“指针”是内部维护的逻辑游标,初始位于第一个元素之前;next()先返回游标后元素再移动游标;无current()方法,ListIterator特例支持索引查询。

Java 中 Iterator 的“指针”不是显式暴露的字段,而是一个**逻辑游标(cursor)**,由迭代器内部维护,用于记录下一次调用 next() 时将返回哪个元素。它不对应数组索引或链表节点地址,而是抽象的位置概念——只服务于“有没有下一个”和“取下一个”这两个操作。
指针初始位置:在第一个元素之前
调用 collection.iterator() 创建迭代器后,游标默认位于集合的“开头间隙”,即第一个元素的前面(类似 ^A B C)。此时:
- hasNext() 返回 true(因为第一个元素 A 确实存在)
- next() 会取出 A,并将游标移动到 A 和 B 之间(A^B C)
next() 的执行逻辑:先取再移,不是先移再取
每次调用 next() 都严格完成两件事:
- 返回当前游标“之后”的那个元素
- 将游标向前推进一个位置(指向下一个间隙)
例如遍历 [X, Y, Z]:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
立即学习“Java免费学习笔记(深入)”;
- 初始:游标在 ^X Y Z → hasNext() = true → next() 返回 X,游标变为 X^Y Z
- 接着:游标在 X^Y Z → hasNext() = true → next() 返回 Y,游标变为 X Y^Z
- 最后:游标在 X Y^Z → hasNext() = true → next() 返回 Z,游标变为 X Y Z^
- 结束:游标在 X Y Z^ → hasNext() = false
没有“获取当前元素”的方法
Iterator 接口不提供类似 current() 或 peek() 的方法。所谓“当前元素”,仅存在于上一次 next() 的返回值中:
- 调用 next() 后,返回值就是此刻逻辑上的“当前”
- 重复调用 next() 会跳过元素,无法回退
- 想保留或重用该值,必须自己用变量保存,比如
String cur = it.next();
ListIterator 是唯一能感知位置的特例
普通 Iterator 不暴露位置信息,但 ListIterator(仅用于 List)额外支持:
- nextIndex():返回下一次 next() 将返回元素的索引(初始为 0)
- previousIndex():返回下一次 previous() 将返回元素的索引(初始为 -1)
- 这些是计算得出的逻辑索引,仍不直接暴露底层结构

















