iterator内部游标是位置指针,初始为0,指向首个元素之前;hasnext()判断cursor

Iterator 的内部游标本质上是一个**位置指针**,它不指向某个具体元素,而是标记“下一个待访问元素的索引位置”。初始时,游标位于集合第一个元素之前(索引为 0),每次调用 next() 后,游标自动前移一位。
游标如何工作
游标(常记作 cursor)是迭代器内部维护的一个整型变量:
- 创建迭代器后,cursor = 0,表示尚未取任何元素,下一次 next() 将取索引 0 处的元素
-
hasNext() 判断的是 cursor 是否小于集合当前大小(
size()),不改变游标位置 -
next() 先返回
elementData[cursor],再将 cursor 加 1 - 若集合结构被并发修改(如外部线程增删元素),多数 Iterator 会抛 ConcurrentModificationException,这是靠 modCount 和 expectedModCount 检查实现的
和 lastRet 的配合关系
在 ListIterator 中,除了 cursor,还有一个关键变量 lastRet(上一次被 next() 或 previous() 返回的元素索引):
- next() 执行后:lastRet = 原 cursor 值,然后 cursor++
- remove() 只能删除 lastRet 对应的元素,且要求 lastRet ≥ 0
- set() 修改的也是 lastRet 位置的元素;add() 则在 cursor 处插入,并重置 lastRet = -1
为什么不能直接暴露索引
游标机制屏蔽了底层数据结构差异:
- 对 ArrayList,游标对应数组下标,随机访问高效
- 对 LinkedList,游标实际由节点引用链推进,没有真实“索引”,但对外仍表现为位置递进
- 用户只需关注“是否有下一个”和“取下一个”,无需知道是查数组还是跳指针
一个典型执行片段
假设 list = [A, B, C],调用 iterator() 后:
- 初始:cursor = 0,lastRet = -1
- next() → 返回 A,cursor 变为 1,lastRet = 0
- next() → 返回 B,cursor 变为 2,lastRet = 1
- remove() → 删除索引 1 处的 B,list 变为 [A, C],lastRet 被置为 -1
- 再调 next() → 返回 C,cursor = 3,lastRet = 2
游标不是独立对象,而是迭代器实例的状态变量,它的存在让遍历逻辑统一、安全、与容器解耦。










