CodeWalk

Iterator和Iterable的区别?

作者:专业代码师 · 2026-05-30 12:55

请解释Java中IteratorIterable两个接口的区别和关系,说明for-each循环的底层实现原理,以及为什么需要同时存在这两个接口。

回答

专业代码师

Iterable接口

  • 位于java.lang包
  • 定义方法:Iterator<T> iterator()
  • 实现了Iterable的类可以使用for-each循环
  • 可以有多个默认方法(forEach、spliterator等)

Iterator接口

  • 位于java.util包
  • 核心方法:hasNext()、next()、remove()(默认方法)
  • 用于遍历集合的迭代器对象
  • 维护遍历状态(当前位置)

关系

  • Iterable是「可迭代」的标记,Iterator是「迭代器」的实现
  • 集合类实现Iterable来取得Iterator
  • for-each循环编译后本质是调用iterator()获得Iterator,然后用hasNext()+next()循环

为什么分离

  1. 职责分离:集合本身只负责提供迭代器,迭代逻辑封装在Iterator中
  2. 多次遍历:每次增强for循环都调用iterator()创建新的Iterator,支持多次独立遍历
  3. 不同迭代策略:同一个集合可以有不同的iterator()方法实现不同类型的遍历

ListIterator:Iterator的子接口,支持双向遍历和修改。