iterator 不支持跳过 hasnext() 直接调用 next(),因为 next() 在无元素时抛出 nosuchelementexception;jdk 强制显式检查以保障遍历安全,标准用法是 while 循环中先 hasnext() 再 next()。

Java 中 Iterator 本身不提供“直接获取下一个元素”的方法,它必须先调用 hasNext() 判断是否有元素,再通过 next() 获取——这是强制的安全机制,防止越界。
为什么不能跳过 hasNext() 直接取下一个?
next() 方法在没有下一个元素时会抛出 NoSuchElementException。JDK 设计上要求开发者显式检查,避免静默失败。这不是限制,而是对遍历安全性的保障。
标准用法:循环中配合 hasNext() 和 next()
最常见、最安全的写法是 while 循环:
- 先调用
iterator.hasNext(),返回true才继续 - 再调用
iterator.next()拿到当前元素并自动移动指针 - 每次
next()都只返回“下一个”,且仅能调用一次(不可重复获取)
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String item = it.next(); // 安全获取下一个
System.out.println(item);
}</string>
想“预览”下一个元素?需要自己缓存
Iterator 接口不支持 peek 或 lookahead。如果业务需要提前知道下一个值(比如解析连续 token),可以封装一个简单包装器:
- 维护一个
nextItem字段,在构造或首次调用时预取一个 - 提供
peek()返回缓存值,不移动指针 - 提供
next()返回并清空缓存,再预取下一个 - 注意处理
hasNext()的逻辑要同步更新缓存状态
增强 for 循环底层也是 Iterator,但隐藏了细节
写 for (String s : list) 时,编译器自动转成迭代器模式,等价于上面的 while 写法。它更简洁,但无法手动控制指针或做条件跳过——真有这类需求,还是得用显式 Iterator。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











