iterable声明“可遍历”能力,提供iterator()等统一入口;iterator封装具体遍历逻辑,含hasnext()、next()等操作方法;二者属协作关系,非继承,共同支撑for-each语法与遍历解耦。

Java集合接口体系中,Iterator 和 Iterable 是两个职责明确、层级不同但紧密协作的接口,它们共同构成了集合遍历的标准化基础。
Iterable 是可遍历能力的声明
Iterable 位于集合体系的顶层,是“可被遍历”这一行为的契约。它不关心怎么遍历,只承诺:我能提供一个迭代器。
- 所有标准集合类(ArrayList、HashSet、LinkedList 等)都直接或间接实现了 Iterable 接口
- Map 虽然本身不实现 Iterable,但其 keySet()、values()、entrySet() 返回的视图都实现了 Iterable,因此也能用增强 for 循环
- JDK 1.5 引入时只有 iterator() 方法;JDK 1.8 新增了 forEach() 和 spliterator(),拓展了遍历语义
Iterator 是具体遍历行为的执行者
Iterator 是实际干活的“工人”,封装了遍历的状态(如当前游标位置)和操作逻辑。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- hasNext() 判断是否还有元素,next() 获取下一个元素——这是最核心的两步,构成 while 循环遍历的基础
- remove() 是唯一允许在遍历中安全修改集合的方法,但必须紧跟在 next() 之后调用一次
- forEachRemaining()(JDK 1.8+)提供函数式遍历剩余元素的能力,常与 Lambda 配合使用
二者关系不是继承,而是协作
Iterable 和 Iterator 没有父子关系,也不是实现关系,而是一种“生产者-消费者”式配合:
- Iterable 的 iterator() 方法返回一个 Iterator 实例,把遍历权交给它
- 增强 for 循环(for-each)本质上就是编译器自动调用 iterable.iterator(),再用 hasNext()/next() 展开
- 这种分离让集合类专注存储,迭代逻辑解耦复用,比如同一个 ArrayList 可以同时支持顺序遍历、反向遍历(通过 ListIterator)、并发遍历(Spliterator)
为什么不能只用其中一个?
如果只有 Iterator,每个集合都要手动暴露一个迭代器实例,无法统一支持 for-each;如果只有 Iterable,就没有具体执行遍历的机制,遍历就成了一句空话。
- Iterable 解决“能不能遍历”的问题,是面向使用者的接口
- Iterator 解决“怎么一步步遍历”的问题,是面向实现者的接口
- 这种分层设计让 Java 集合既保持统一语法(for-each),又支持多样实现(数组、链表、哈希表等内部结构互不影响)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










