自定义iterator需实现java.util.iterator接口,提供hasnext()、next()和remove()方法,维护内部游标状态,配合iterable支持for-each;建议加fail-fast机制检测并发修改,并使用泛型确保类型安全。

自定义实现 Iterator 迭代器,核心是让类实现 java.util.Iterator 接口,并提供 hasNext()、next() 和可选的 remove() 三个方法的逻辑。关键在于维护内部状态(如当前索引或游标),并确保线程安全与 fail-fast 行为(如需兼容增强 for 循环)。
1. 基础实现:基于数组的简单迭代器
以封装 int 数组为例,不依赖集合框架,手动管理位置:
- 定义私有字段
private final int[] data;和private int cursor = 0; -
hasNext()返回cursor -
next()先校验hasNext(),再返回data[cursor++];若越界抛NoSuchElementException -
remove()可暂抛UnsupportedOperationException(除非你真要支持删除)
2. 与 Iterable 配合:让类可被 for-each 遍历
仅实现 Iterator 不够——要让自定义容器支持 for (T x : container),还需实现 Iterable
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 在容器类中添加
public Iterator<t> iterator() { return new MyIterator(); }</t> - 推荐将迭代器定义为私有内部类,访问外部类的字段(如数组、size、modCount)
- 避免每次调用
iterator()都新建对象(可复用无状态迭代器),但要注意并发修改问题
3. 支持 fail-fast:检测并发修改
模仿 ArrayList 的行为,在多线程或迭代中被修改时快速失败:
- 容器类加字段
private int modCount = 0;,每次结构修改(add/remove)就modCount++ - 迭代器内部保存初始
expectedModCount = modCount - 每次
next()或hasNext()前检查if (modCount != expectedModCount),不一致则抛ConcurrentModificationException - 注意:这仅是检测手段,不是线程安全保证
4. 泛型与类型安全:避免原始类型陷阱
不要写 Iterator(裸类型),始终用泛型:
- 迭代器类声明为
private class MyIterator implements Iterator<string></string> - 容器类实现
Iterable<string></string>,而非Iterable - 返回值用
@Override public String next(),编译器会检查类型,避免运行时 ClassCastException - 若需支持多种类型,用泛型容器类:
class MyList<t> implements Iterable<t></t></t>
不复杂但容易忽略:Iterator 是单向、一次性、不可重置的。如需多次遍历,应每次调用 iterator() 获取新实例;若要双向或可重复,考虑实现 ListIterator 或提供 reset() 方法(非标准,需自行设计)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










