iterable是java中表示“可被遍历”能力的顶层接口,位于java.lang包,仅强制定义iterator()方法以提供iterator;jdk8新增foreach和spliterator等默认方法,核心职责是声明遍历资格,支撑for-each语法。

Iterable 是 Java 中表示“可被遍历”的能力的接口,它不负责具体怎么遍历,而是承诺:我能给你一个迭代器(Iterator),你拿它去遍历就行。
Iterable 是什么?
它位于 java.lang 包中,是集合类的顶层契约之一。只要一个类实现了 Iterable,就能用 for-each 循环(增强 for 循环)来遍历它的元素。
- 核心方法只有
iterator(),返回一个Iterator对象 - JDK 8 起还增加了
forEach(Consumer)和spliterator(),但本质仍是围绕“提供遍历入口”展开 -
Collection、List、Set等集合接口都直接或间接继承了Iterable,所以所有常见集合天然支持for-each
Iterator 是什么?
Iterator 是真正干活的“遍历执行者”,位于 java.util 包中。它封装了遍历状态(比如当前走到哪了),并提供操作指令。
-
hasNext():问“后面还有没有元素?” -
next():取“下一个元素”,同时把指针往后挪一位 -
remove():删掉上一次next()返回的那个元素(可选,多数实现默认不支持) - 它是有状态的——同一个
Iterator实例多次调用next()会逐步推进;而反复调用collection.iterator()会得到**新的、独立的**迭代器
关键区别在哪?
它们不是同类东西,更像是“资格证”和“上岗证”的关系:
- 角色不同:Iterable 表示“我允许你遍历我”,Iterator 表示“我现在正在遍历你”
- 职责分离:Iterable 不保存遍历位置,避免集合自身被污染;Iterator 独立持有状态,保证多线程或嵌套遍历时互不干扰
-
使用场景不同:写通用工具方法时,参数常声明为
Iterable<t></t>(兼容所有可遍历类型);需要手动控制遍历节奏或边遍历边删除时,才显式获取并操作Iterator -
包归属不同:Iterable 属于语言基础层(
java.lang),Iterator 属于集合工具层(java.util)
一个直观例子
假设你有个 ArrayList<string> list = Arrays.asList("a", "b", "c");</string>:
-
for (String s : list)—— 编译器自动调用list.iterator(),拿到 Iterator,再循环调用hasNext()和next() -
Iterator<string> it = list.iterator(); it.next(); it.next();</string>—— 你直接操控迭代过程,可以跳过、暂停、或在特定条件下调用it.remove()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











