Iterator的hasNext()用于预判下一次next()是否合法,即判断是否还有未访问元素;它只读检查隐式游标位置,不移动游标,典型安全遍历需先hasNext()再next()。

Java 中的 Iterator 并不暴露“指针”概念,它通过 hasNext() 和 next() 协同工作来安全遍历集合,hasNext() 的作用是**预判下一次调用 next() 是否合法**,而不是移动或检查当前指针位置。
hasNext() 的真实含义
hasNext() 不是“判断指针是否在末尾”,而是“判断是否还有未被访问的元素可供取出”。它内部维护一个隐式游标(cursor),指向下一个待返回元素的位置。初始时游标在第一个元素之前;每次成功调用 next() 后,游标前移一位。
- 首次调用
hasNext():检查第一个元素是否存在 → 返回true(若集合非空) - 在最后一个元素被
next()取出后,游标已移到末尾之后 → 再调用hasNext()返回false -
hasNext()本身不改变游标位置,只做只读检查
典型安全遍历模式(推荐写法)
标准 while 循环结构正是基于 hasNext() 的预判逻辑设计的:
Iterator<String> it = list.iterator();
while (it.hasNext()) { // ✅ 先确认“有下一个”
String item = it.next(); // ✅ 再安全取出
System.out.println(item);
}
这种写法避免了 NoSuchElementException,因为 next() 永远只在已确认存在元素时才被调用。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
常见误区与错误用法
以下做法容易出错,需避免:
-
重复调用
next()而不检查:it.next(); it.next();—— 第二次可能抛异常 -
用
hasNext()判断“是否已到末尾”再 break:逻辑颠倒,hasNext()是问“后面还有吗”,不是“我现在在最后吗” -
在循环中混用 for-each 和手动 Iterator:for-each 底层也用 Iterator,但隐藏了控制权,不应与显式
it.next()交叉使用
想“看一眼”下一个元素?用 peek 模式(需自行封装)
原生 Iterator 不支持“窥探”(peek),但可通过临时保存实现:
Iterator<Integer> it = list.iterator();
Integer nextItem = null;
if (it.hasNext()) {
nextItem = it.next(); // 取出并暂存
}
// 后续可基于 nextItem 做判断,再继续遍历(注意:此时游标已移动)
若需真正可重复查看的迭代器,建议改用 ListIterator(支持 previous() 和双向游标)或封装带缓存的迭代器。

















