必须先调用hasnext()确认存在元素,再调用next()获取并推进指针;hasnext()仅探测不移动指针,next()必移动指针并返回元素,二者须严格配对,否则抛nosuchelementexception。

Java 中 Iterator 的 hasNext() 和 next() 必须严格按顺序配合使用:先用 hasNext() 探路,确认有元素后再用 next() 取值并推进指针。跳过检查直接调用 next() 会抛 NoSuchElementException;在条件中连写 it.next() != null 不仅逻辑错误,还可能跳过元素或触发空指针。
核心配合逻辑
hasNext() 是“只看不走”的探测方法,不改变迭代器状态;next() 是“边走边拿”的消费方法,每次调用都会移动内部指针并返回当前元素。二者构成原子操作对——每个 next() 都必须由一次 hasNext() 的 true 结果保障。
- 迭代器初始时指向第一个元素之前,首次
hasNext()判断的是首个元素是否存在 -
hasNext()返回false时,再调用next()必然抛异常,Java 不做容错 - 不能用
next()的返回值是否为null判断循环继续,因为集合本身可存null元素,且next()设计本意不是检测
标准 while 循环写法
这是最安全、最通用的遍历模式,适用于所有 Collection 类型(List、Set)及 Map 的视图(keySet()、values()、entrySet()):
- 获取迭代器:
Iterator<string> it = list.iterator();</string> - 循环条件只放
hasNext():while (it.hasNext()) - 循环体内立即调用
next()并赋值处理:String s = it.next();
示例:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Iterator
while (it.hasNext()) {
String item = it.next(); // ✅ 每次取值前都已确认存在
System.out.println(item);
}
遍历时安全删除元素
要在遍历中修改集合(如删除满足条件的元素),唯一合法方式是调用 it.remove(),且必须满足两个前提:
- 刚执行过一次
next(),且尚未再次调用next() - 每个
next()后最多调用一次remove()
错误做法(直接调集合的 remove())会触发 ConcurrentModificationException。
while (it.hasNext()) {
String s = it.next();
if (s.length() == 1) {
it.remove(); // ✅ 正确:紧跟 next() 后调用
}
}
常见错误写法辨析
以下写法看似简洁,实则危险或无效:
-
while (it.hasNext()) { it.next(); it.next(); }→ 第二个next()无hasNext()保护,极易越界 -
while (it.next() != null)→ 首次就跳过第一个元素,且null不代表结束(集合允许存null),还会在末尾抛异常 -
if (it.hasNext()) it.next(); while (it.hasNext()) { ... }→ 开头多取一次,导致循环少处理一个元素
这些错误本质都是打破了 hasNext() 与 next() 的配对契约。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










