要在自定义集合中支持Java迭代器,需让集合实现Iterable接口并返回Iterator实例;内部迭代器类维护遍历位置,实现hasNext()、next()和可选remove();建议加入modCount机制实现fail-fast;注意使用参数化类型确保类型安全。

要在自定义集合中支持 Java 迭代器,核心是让集合类实现 Iterable 接口,并在其中返回一个实现了 Iterator 的对象。这个迭代器需能按需遍历你集合内部的数据结构(比如数组、链表等),同时保证线程安全和 fail-fast 行为(可选但推荐)。
1. 让自定义集合实现 Iterable
这是使用 for-each 循环的前提。只需提供一个 iterator() 方法,返回一个迭代器实例:
- 集合类声明要加上
implements Iterable -
iterator()方法必须返回Iterator类型的对象 - 通常返回内部私有迭代器类的实例,避免暴露实现细节
2. 编写内部迭代器类(实现 Iterator)
该类需维护当前遍历位置(如索引或节点引用),并实现三个方法:
-
hasNext():判断是否还有下一个元素(检查索引是否越界、节点是否非空) -
next():返回下一个元素,并将位置前移;若无元素应抛NoSuchElementException -
remove()(可选):删除上一次next()返回的元素;若不支持,直接抛UnsupportedOperationException
例如,基于数组的简单集合可这样写:
private class ArrayIterator implements Iterator<e> {
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor </e>3. 加入 fail-fast 支持(增强健壮性)
标准集合(如 ArrayList)会在迭代过程中检测集合被意外修改(如其他线程或同一线程调用 add/remove),立即抛 ConcurrentModificationException。你可以通过维护一个“修改计数器”(modCount)来模拟:
- 集合每次结构性修改(增/删)时递增
modCount - 迭代器创建时记录当时的
modCount值(如expectedModCount) - 每次调用
hasNext()或next()前,检查两者是否一致,不一致就抛异常
4. 注意泛型与类型安全
不要用原始类型(如 Iterator),始终使用参数化类型(Iterator)。若底层存储是 Object[],转型时加 @SuppressWarnings("unchecked") 是常见且安全的做法(前提是逻辑确保类型正确)。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











