要支持增强for循环,集合类必须实现Iterable接口并提供每次返回新迭代器实例的iterator()方法,确保遍历状态隔离;迭代器需正确实现hasNext()和next(),remove()方法可选但若实现须满足调用约束。

要在自定义集合中支持增强 for 循环(for (T item : collection)),必须正确实现 Iterable<t></t> 接口,核心是提供一个返回 Iterator<t></t> 的 iterator() 方法。关键不在于“继承”或“重写”,而在于逻辑上能持续、安全、独立地遍历元素。
实现 Iterable 的基本结构
你的集合类需声明实现 Iterable<e></e>,并提供 public Iterator<e> iterator()</e> 方法。该方法每次调用都应返回**新的、独立的迭代器实例**,避免多个 for 循环互相干扰。
例如:
public class MyList<E> implements Iterable<E> {
private final Object[] elements;
private int size;
// 构造、add 等方法略...
@Override
public Iterator<E> iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator<E> {
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor < size;
}
@Override
@SuppressWarnings("unchecked")
public E next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return (E) elements[cursor++];
}
// remove() 可选,若不支持可抛 UnsupportedOperationException
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
注意迭代器的状态隔离与线程安全性
每个 iterator() 调用必须返回新对象。如果复用同一个迭代器实例(比如返回 this 或缓存单例),会导致多个增强 for 循环共享状态,产生不可预期行为(如提前结束、并发修改异常)。
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:每次
iterator()都 new 一个新迭代器 - ❌ 错误:返回 this(除非类本身同时是 Iterator)、或 static 单例迭代器
- ⚠️ 注意:标准迭代器不保证线程安全;若需多线程遍历,应确保底层数据不可变,或在迭代器内加锁(通常不推荐,优先用
Collections.unmodifiableList等)
支持 remove() 的注意事项
如果希望增强 for 中调用 iterator().remove() 生效(虽然增强 for 语法本身不直接暴露 remove),迭代器的 remove() 方法必须:
- 仅在刚调用过
next()后才允许调用 - 实际从集合中删除对应元素(需同步更新集合状态,如
size--、移动后续元素等) - 多次调用或未调用
next()就调用,应抛IllegalStateException
大多数自定义集合若不打算支持删除操作,直接抛 UnsupportedOperationException 更清晰安全。
利用现有工具简化实现(Java 8+)
若底层已有数组或 List,可用 Stream 或匿名内部类快速构建迭代器,减少样板代码:
@Override
public Iterator<E> iterator() {
return Arrays.stream((E[]) elements)
.limit(size)
.iterator();
}
但注意:这会创建额外对象和 Stream 开销,生产环境建议手写轻量迭代器;调试或原型阶段可接受。


















