要让自定义类支持for-each循环,必须实现Iterable接口并重写iterator()方法返回Iterator实例;该实例可为内部类、匿名类或独立类,每次调用应返回新实例以保证遍历独立性,且需保持泛型类型一致。

要让自定义类支持 for-each 循环,关键不是“实现 Iterator”,而是让该类实现 Iterable 接口,并在 iterator() 方法中返回一个 Iterator 实例——这个实例可以是内置的(如基于集合)、匿名内部类,也可以是独立定义的迭代器类。
1. 自定义类实现 Iterable 接口
Iterable 接口只有一个抽象方法:Iterator<t> iterator()</t>。你的类实现它后,就能被增强 for 循环遍历。
例如,定义一个只存两个字符串的容器:
public class MyContainer implements Iterable<String> {
private final String first;
private final String second;
public MyContainer(String first, String second) {
this.first = first;
this.second = second;
}
@Override
public Iterator<String> iterator() {
return new MyIterator();
}
// 内部迭代器类
private class MyIterator implements Iterator<String> {
private int index = 0;
@Override
public boolean hasNext() {
return index < 2;
}
@Override
public String next() {
switch (index++) {
case 0: return first;
case 1: return second;
default: throw new NoSuchElementException();
}
}
// remove() 可选,通常抛 UnsupportedOperationException
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
使用时即可:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
MyContainer container = new MyContainer("a", "b");
for (String s : container) {
System.out.println(s); // 输出 a, b
}
2. 使用匿名内部类或 Lambda(Java 8+)简化
如果逻辑简单,可直接在 iterator() 中返回匿名类,甚至用 Lambda(需配合工具类或已有迭代逻辑):
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
private int idx = 0;
@Override public boolean hasNext() { return idx < 2; }
@Override public String next() {
return idx++ == 0 ? first : second;
}
@Override public void remove() { throw new UnsupportedOperationException(); }
};
}
注意:Lambda 不能直接用于 Iterator(因含多个抽象方法),但可用于封装后的流式构造,比如结合 Stream.of(...) + iterator(),不过那属于间接方式,不推荐作为“自定义迭代逻辑”的首选。
3. 迭代器状态与线程安全
自定义 Iterator 通常持有外部类的状态(如索引、游标),因此:
- 每次调用
iterator()应返回**新实例**,避免多个 for-each 共享同一迭代器导致冲突; - 若容器本身可变(如支持 add/remove),迭代器应考虑 fail-fast 行为(检查 modCount),但这属于高级需求;
- 默认不保证线程安全,多线程遍历时需额外同步或使用线程安全的容器结构。
4. 泛型与类型一致性
务必保持泛型参数统一:
- 类声明为
implements Iterable<T>; -
iterator()返回Iterator<T>; - 自定义迭代器实现
Iterator<T>,且next()返回T类型。
编译器会据此做类型检查,避免运行时 ClassCastException。

















