hasNext()用于安全检查迭代器后续是否有元素,不移动指针、不取值;必须先调用hasNext()再调用next(),否则可能跳过元素或抛异常;典型模式为while(it.hasNext()) { it.next(); },且remove()须紧随next()后调用。

用 hasNext() 方法判断是否有下一个元素。
hasNext() 的作用和特点
这个方法只做一件事:检查迭代器当前位置之后是否还存在未访问的元素。它不移动指针,也不取值,纯粹是“探路”操作。
- 返回 true 表示还有至少一个元素可读
- 返回 false 表示已到集合末尾,遍历应停止
- 调用后,迭代器内部指针位置不变
为什么不能直接用 next() 判断?
next() 每次调用都会把指针前移并返回元素。如果用它来“试探”,会导致跳过第一个有效元素,甚至在无元素时抛出 NoSuchElementException 异常。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 错误写法:
if (it.next() != null)—— 元素被取走且无法退回 - 正确逻辑:先
hasNext(),再next()
典型使用模式(while 循环)
这是最安全、最标准的遍历方式:
立即学习“Java免费学习笔记(深入)”;
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String element = it.next(); // 此时调用 next() 是安全的
System.out.println(element);
}
- 每次循环开始前,
hasNext()确保next()不会越界 - 循环体中可放心使用
next()获取当前元素 - 无需预先知道集合大小或索引位置
注意 remove() 的依赖关系
remove() 方法只能在刚调用过 next() 后使用,否则会抛出 IllegalStateException。
- 必须先
hasNext()→ 再next()→ 才能remove() - 连续两次
remove()也会报错(一次next()对应最多一次remove())

















