必须先调用 hasnext() 再调用 next(),因为 next() 不做边界检查,假设已有 hasnext() 确认存在元素,否则抛 nosuchelementexception;这是为避免重复判断、提升性能而将控制权交予开发者。

用 Iterator 遍历集合时,hasNext() 和 next() 必须配合使用,核心原则是:每次调用 next() 前,必须先用 hasNext() 确认还有元素可取,否则会抛出 NoSuchElementException。
为什么不能跳过 hasNext() 直接调用 next()
next() 不做边界检查,它假设调用者已通过 hasNext() 确保有下一个元素。如果集合已遍历完还调用 next(),就会立即报错。这不是设计缺陷,而是为了性能——避免重复判断,把控制权交给开发者。
标准写法:while 循环 + 先判后取
最安全、最常用的模式是:
- 用
while (iterator.hasNext())控制循环条件 - 在循环体内调用
iterator.next()获取当前元素 - 每次
next()都对应一次成功的hasNext()判断
示例:
List<string> list = Arrays.asList("a", "b", "c");
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String item = it.next(); // 安全:hasNext 已确保有元素
System.out.println(item);
}</string></string>
常见错误写法及后果
-
循环外多调一次 next():比如在 while 后再写一行
it.next()→ 报NoSuchElementException - 用 for(int i=0;...) 混用 iterator:既用索引又用迭代器,逻辑混乱,容易越界
-
在 hasNext() 为 false 后仍缓存或重用 next() 结果:
next()是“消耗性”操作,每次调用都推进指针,不可回退
增强 for 循环其实是 Iterator 的语法糖
写 for (String s : list) 时,编译器自动帮你做了和上面 while 完全一样的事:获取 iterator、反复调用 hasNext() 和 next()。所以它本质更安全,也更简洁,除非需要中途 remove 元素(此时必须用显式 Iterator 的 remove() 方法)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











