Java中自定义类支持增强for循环需实现Iterable接口并提供每次调用都返回新Iterator实例的iterator()方法,Iterator必须正确实现hasNext()、next()(抛NoSuchElementException)和remove()(可选)。

在 Java 中,让自定义类支持增强 for 循环(for (X x : obj)),关键就是实现 Iterable<t></t> 接口,并提供一个符合规范的 Iterator<t></t> 实例。
实现 Iterable 接口并重写 iterator() 方法
只需让类实现 Iterable<t></t>,并返回一个能遍历你数据的 Iterator<t></t> 对象。这个迭代器可以是匿名内部类、私有内部类,或单独的类 —— 只要它正确实现 hasNext() 和 next() 即可。
- 泛型参数
T应与你要遍历的元素类型一致(比如你的容器存的是String,就写Iterable<string></string>) -
iterator()方法必须每次调用都返回**新的、独立的**迭代器实例,否则多个 for 循环会互相干扰 - 不要直接返回
Collection.iterator()(除非你内部确实用的是标准集合且行为符合预期)
手写 Iterator:注意三个核心方法
自定义 Iterator 至少要实现 hasNext()、next(),推荐也实现 remove()(可抛 UnsupportedOperationException)。
-
hasNext()判断是否还有下一个元素,通常靠维护一个游标(如index)或状态标志 -
next()返回当前元素并推进游标;若已无元素,应抛NoSuchElementException - 避免在
next()中做耗时操作或副作用,保持迭代器轻量、可预测
一个完整示例:IntRange 类支持遍历整数区间
比如想让 new IntRange(2, 5) 能被 for-each 遍历为 2, 3, 4, 5:
public class IntRange implements Iterable<integer> {
private final int from;
private final int to;
<pre class="brush:php;toolbar:false;">public IntRange(int from, int to) {
this.from = from;
this.to = to;
}
@Override
public Iterator<integer> iterator() {
return new Iterator<integer>() {
private int current = from - 1;
@Override
public boolean hasNext() {
return current <p>}</p></integer></integer>
使用方式:for (int i : new IntRange(2, 5)) { System.out.println(i); } → 输出 2、3、4、5。
进阶建议:用内部类或外部类封装 Iterator
当逻辑复杂(比如树的中序遍历、图的 BFS 迭代)时,把 Iterator 拆成独立的私有静态内部类更清晰、易测试、可复用。
- 静态内部类不持有外部类引用,避免内存泄漏风险
- 可添加构造参数(如传入根节点、初始状态),提升灵活性
- 如果迭代逻辑通用,甚至可抽成公共工具类,供多个容器复用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











