在自定义容器类中实现Iterator,需让容器实现Iterable接口并提供iterator()方法,再通过内部类实现Iterator接口的hasNext()、next()和remove()方法,推荐支持fail-fast机制以保障遍历安全。

在自定义容器类中实现 Iterator,核心是让容器提供一个返回 Iterator 实例的方法(通常是 iterator()),并单独实现一个满足 Iterator 接口的内部类(或匿名类、lambda——但 lambda 仅适用于简单场景,不推荐用于有状态的迭代器)。
1. 容器类需实现 Iterable 接口
Java 要求容器能被增强 for 循环(for (T e : container))遍历,就必须实现 Iterable<t></t> 接口,该接口只有一个抽象方法:Iterator<t> iterator()</t>。这是入口点。
例如,一个基于数组的简单整数容器:
public class IntArrayContainer implements Iterable<Integer> {
private int[] data;
private int size;
public IntArrayContainer(int capacity) {
this.data = new int[capacity];
this.size = 0;
}
public void add(int value) {
if (size < data.length) {
data[size++] = value;
}
}
@Override
public Iterator<Integer> iterator() {
return new IntArrayIterator();
}
}
2. 实现 Iterator 的内部类(推荐方式)
内部类可直接访问容器的私有字段(如 data 和 size),便于安全、高效地控制遍历状态。必须实现三个方法:
立即学习“Java免费学习笔记(深入)”;
-
hasNext():判断是否还有下一个元素(检查索引是否小于
size) -
next():返回当前元素,并将游标前移;若无元素应抛
NoSuchElementException -
remove()(可选):删除上一次
next()返回的元素;若未调用next()或已调用remove(),应抛IllegalStateException;多数自定义迭代器可暂不实现或抛UnsupportedOperationException
示例实现:
private class IntArrayIterator implements Iterator<Integer> {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < size;
}
@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return data[currentIndex++];
}
@Override
public void remove() {
throw new UnsupportedOperationException("Remove not supported");
}
}
3. 注意迭代器的安全性与一致性
真实项目中建议支持“快速失败”(fail-fast)机制:当容器结构被外部修改(如并发 add/remove),而迭代器仍在使用时,应尽快抛出 ConcurrentModificationException。这通常通过维护一个 modCount(修改计数)和 expectedModCount 实现。
在容器每次结构修改(如 add、remove)时递增 modCount;迭代器构造时记录当前值为 expectedModCount;每次调用 next() 或 hasNext() 前检查二者是否一致。
4. 使用示例与验证
实现完成后,即可正常使用:
IntArrayContainer container = new IntArrayContainer(5);
container.add(10);
container.add(20);
container.add(30);
// 增强 for 循环
for (int i : container) {
System.out.println(i); // 输出 10, 20, 30
}
// 手动使用迭代器
Iterator<Integer> it = container.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
若忘记实现 iterator() 方法或返回 null,运行时会报 NullPointerException 或编译不通过(因未实现 Iterable 的抽象方法)。


















