Iterator需通过集合的iterator()获取,必须先hasNext()再next(),remove()仅限next()后立即调用,forEachRemaining()是Java 8批量处理剩余元素的简洁替代。

Iterator 接口本身不能直接 new,必须通过集合对象的 iterator() 方法获取其实例。调用时需严格遵循“先判断、后取值”的顺序,否则容易触发异常。
hasNext() 和 next() 必须配合使用
这两个方法是 Iterator 最核心的组合,不能拆开调用:
- hasNext() 是“探测”操作:只检查是否还有下一个元素,不移动内部指针,也不改变状态
- next() 是“消费”操作:返回当前指针指向的元素,并立即将指针向后移动一位
- 每次调用 next() 前,必须确保 hasNext() 返回 true;否则会立即抛出 NoSuchElementException
- 典型安全写法只有这一种:
while (it.hasNext()) { String s = it.next(); ... }
remove() 只能在 next() 后立即调用
这个方法用于在遍历中安全删除当前元素,有严格前提:
- 必须在刚调用过 next() 之后调用,且中间不能插入其他 next() 或 hasNext()
- 如果上一次操作不是 next()(比如刚创建迭代器或刚调用过 remove()),调用 remove() 会抛 IllegalStateException
- 它删除的是 最近一次 next() 返回的那个元素,不是传入参数的元素
- 不能用集合自身的 remove() 替代,否则会触发 ConcurrentModificationException
forEachRemaining() 适合批量处理剩余元素
Java 8 引入的默认方法,用于简洁处理剩余所有元素:
- 等价于
while (it.hasNext()) { action.accept(it.next()); },但更简洁 - 常用于打印、日志、简单转换等场景,例如:
it.forEachRemaining(System.out::println); - 内部仍基于 hasNext()/next() 实现,所以同样受类型擦除和空指针影响











