iterator指针单向前进、不可重置,初始位于首元素前;next()移动并返回元素,hasnext()仅判断不移动;无自动同步,不支持反向或重置,误用会导致跳过或越界。

Iterator 的内部指针不是自动循环或回溯的,它是一次性向前推进的游标,每次调用 next() 才移动一次,且只朝一个方向(向后)走。
指针初始位置在第一个元素之前
调用 collection.iterator() 时,新创建的迭代器指针并不指向第一个元素,而是停在“首元素上方”或“索引 -1”的逻辑位置。此时:
- hasNext() 检查的是“从当前位置往后看,有没有下一个可返回的元素”,不移动指针;
- next() 先将指针向下移动一位,再读取并返回该位置上的元素;
- 如果集合为空,首次调用 next() 会直接抛出
NoSuchElementException。
移动完全依赖 next() 调用,不感知外部变更
指针不会因集合被其他线程修改、新增或删除元素而自动调整位置,也不重新扫描结构:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 在 ArrayList 或 LinkedList 中,指针本质是维护一个整数下标(如 cursor)或节点引用(如 current node);
- 每调用一次 next(),下标加 1,或引用更新为
current.next; - 即使你中途用 remove() 删除了刚返回的元素,指针仍继续向前,不会重试或回退。
无法手动重置或反向移动
标准 Iterator 接口没有 reset()、previous() 或 seek() 方法:
- 想从头再遍历?只能重新调用 collection.iterator() 获取新迭代器;
- ListIterator 是特例,支持双向移动和索引定位,但它不是普通 Iterator;
- ConcurrentLinkedQueue 等并发容器的迭代器更特殊——它基于链表快照,指针沿 next 向前推进,但会跳过 item == null 的已删除节点,不保证覆盖全部实时状态。
常见误操作导致指针“异常”
不是指针坏了,而是使用方式违背了迭代器契约:
- 在 while (it.hasNext()) 循环里反复调用 it.next() 两次(比如用于判空再取值),会导致跳过元素;
- 把 it.next() != null 当作循环条件,既触发移动又做判断,极易越界或漏值;
- 多线程共享同一个迭代器实例,指针状态互相干扰,行为不可预测。










