Java中Iterator指针初始位置在第一个元素之前,因该设计使hasNext()可安全探路、next()才移动并返回跨过元素,避免越界,且空集合时hasNext()自然返回false。

Java 中 Iterator 的指针初始位置在**第一个元素之前**,不是指向第一个元素,也不是“位于索引 0 处”,而是一个逻辑上的前置状态。
为什么设计成“在第一个元素之前”?
这种设计让遍历逻辑更统一、更安全:
- 调用 hasNext() 是探路操作——它检查“前面有没有元素”,不移动指针
- 只有调用 next() 才真正移动指针,并返回它刚刚跨过的那个元素(即第一个元素)
- 这样避免了“先取再判断”导致的越界风险,也使空集合的处理自然:初始时
hasNext()就返回false
指针位置与内部字段的对应关系
以 ArrayList 的迭代器为例,底层用 cursor 字段记录当前位置:
- 初始时
cursor = 0,表示“还没走到索引 0 的元素” - 第一次
next()后,cursor变为 1,同时返回elementData[0] -
lastRet 记录上一次
next()返回的索引(如 0),供remove()使用
常见误解澄清
不要把迭代器指针类比成数组下标或数据库游标:
立即学习“Java免费学习笔记(深入)”;
- 它不能回退(除非重新获取新迭代器)
- 它不支持随机访问(
get(i)这类操作) - 它不是“指向某处的引用”,而是一个封装了状态(cursor、lastRet、expectedModCount)的对象
- 每次调用
iterator()都会创建一个全新实例,指针重置到初始位置
验证初始位置的小技巧
写一段极简代码就能直观看到效果:
List<String> list = Arrays.asList("A", "B");
Iterator<String> it = list.iterator();
System.out.println(it.hasNext()); // true → 前面有元素
// System.out.println(it.next()); // 若取消注释,才真正开始取值
没调用 next() 之前,指针就停在“A”之前,静待出发。


















