Java Iterator的“指针”是逻辑游标,初始位于首元素之前;next()推进游标并返回元素,hasNext()仅判断不移动;remove()删除上一次next()返回的元素,须在next()后且未remove过才安全。

Java Iterator 的“指针”不是真实内存地址,而是一个逻辑游标,由迭代器内部状态维护。它不暴露给用户,也不支持手动控制,只通过 hasNext() 和 next() 协同驱动。
指针初始位置:在第一个元素之前
调用 collection.iterator() 时,新创建的迭代器对象,其内部游标默认停在集合首元素的“上方”或“之前”——这个位置是空的,不代表任何有效元素。此时调用 next() 才会真正落到第一个元素上并返回它。
next() 是唯一触发指针移动的操作
- hasNext() 只做判断:检查游标当前位置的下一个位置是否存在元素,不改变游标位置;
- next() 必然执行两件事:先将游标向前推进一位,再返回该位置上的元素;
- 连续调用两次 next(),游标就移动了两步,跳过中间元素无法回退;
- 如果游标已到末尾再调用 next(),抛出 NoSuchElementException。
不同集合的指针行为有差异
虽然接口统一,但底层实现决定游标如何定位和推进:
- ArrayList:游标本质是数组下标(int index),next() 就是 index++ 并取 elementData[index];
- LinkedList:游标是节点引用(Node current),next() 就是 current = current.next;
- ConcurrentLinkedQueue:游标基于弱一致性快照,构造时尽力找首个非 null 节点作为起点,之后只沿 next 链推进,跳过 item == null 的节点,不响应实时修改。
remove() 删除的是 lastReturned 元素
迭代器内部还维护一个 lastReturned 引用,记录上一次 next() 返回的节点或位置。调用 remove() 时,删的就是它——不是当前游标位置,也不是下一个元素。必须在 next() 之后、且未被 remove 过,才能安全调用 remove(),否则抛 IllegalStateException。
立即学习“Java免费学习笔记(深入)”;


















