Iterable 是被遍历者的契约,定义谁可被 for-each 遍历,仅含 iterator() 方法;Iterator 封装遍历行为,含 hasNext()、next() 等状态操作;二者分离集合与遍历逻辑,支持多遍历方式并隐藏内部结构。

Iterable 和 Iterator 是迭代器模式(Iterator Pattern)在 Java 中的典型实现,二者分工明确、协作紧密,共同构成“容器可遍历”能力的基础设计。
Iterable 是“被遍历者”的契约
它定义了“谁可以被 for-each 遍历”。一个类实现 Iterable 接口,就承诺能提供一个 Iterator 实例——即告诉外界:“我能交出一个迭代器,让你按顺序访问我的元素”。
核心方法只有 iterator(),不关心怎么遍历,只负责“生产迭代器”。
常见实现类如 ArrayList、HashSet、HashMap(keySet/entrySet)等,它们本身是数据容器,不直接暴露内部结构,而是通过 Iterable 解耦遍历逻辑。
Iterator 是“遍历行为”的封装
它代表“一次具体的遍历过程”,封装了游标位置、是否还有下一个元素、如何获取当前元素等状态和操作。
关键方法有 hasNext()、next()、remove()(可选),所有操作都围绕当前迭代状态展开。
每次调用 Iterable.iterator() 都应返回**新的、独立的 Iterator 实例**,保证多线程或嵌套遍历互不干扰。
二者组合体现迭代器模式的核心思想
- 分离“集合对象”与“遍历算法”:容器(Iterable)不掺杂遍历逻辑,迭代器(Iterator)不依赖具体容器实现;
- 支持多种遍历方式:同一容器可提供不同 Iterator(如正序/逆序、过滤后视图),只需新增 iterator() 的返回实现;
- 隐藏内部结构:客户端通过统一的 hasNext()/next() 操作数据,无需知道是数组、链表还是哈希桶;
- for-each 循环底层自动调用 iterable.iterator(),再反复调用其 next(),语法糖背后是两者协作。
注意边界:Iterable 不是 Iterator 的工厂接口,而是“可产生迭代器”的能力声明
虽然 iterator() 方法返回 Iterator,但 Iterable 本身不继承 Iterator,也不具备 next() 等行为。这种“能力声明 + 行为委托”的分层,正是面向接口编程与职责分离的体现。强行让容器同时实现 Iterable 和 Iterator 容易导致状态混乱(比如多个 for-each 共享同一个游标),违背模式本意。

















