自定义迭代器需实现iterable接口并每次返回新iterator实例,其核心是hasnext()、next()、remove()三方法的正确闭环;支持倒序、过滤、惰性计算等场景,并应遵循fail-fast机制与线程安全规范。

自定义迭代器不是写个 next() 就完事,关键在于让容器“可被统一遍历”,同时保证行为符合 Java 语义——比如支持增强 for 循环、不干扰多线程或多次遍历、状态隔离清晰。下面直击实操要点。
让容器实现 Iterable 接口
这是所有便利的起点。只要你的类实现了 Iterable<t></t>,它就能用 for (T t : myContainer) 遍历。
- 泛型参数
T必须和容器实际存的类型一致,比如MyStack<integer></integer>就得实现Iterable<integer></integer> -
iterator()方法每次调用都必须返回一个**新创建的迭代器实例**,不能缓存或复用同一个对象;否则多个 for-each 同时跑会互相踩踏游标 - 不要在容器内部维护一个全局迭代器字段,那是典型错误设计
编写合规的 Iterator 实现类
这个类要真正负责“怎么走、走到哪、还能不能走”。核心是三个方法的逻辑闭环:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
hasNext():只做判断,不移动状态;通常对比当前索引和数据边界(如cursor 或 <code>index > 0倒序) -
next():先校验hasNext()是否为 true,再取值并推进游标;如果已到末尾,必须抛NoSuchElementException,不能静默返回 null -
remove():非必须实现;若不支持,直接抛UnsupportedOperationException;若支持,需确保只能删刚next()过的元素,且不能连续调用两次
常见定制场景与写法示例
不只是正向遍历,很多业务需要特殊顺序或动态生成:
-
倒序遍历:游标从长度开始递减,
hasNext()判index > 0,next()先index--再取值 -
跳过空值或过滤遍历:在
next()内部加 while 循环跳过不符合条件的元素,直到找到有效项或越界 -
惰性计算/生成式迭代器:比如遍历斐波那契数列、文件行流、网络分页结果;
next()每次触发一次计算或 IO,不预先加载全部数据
避坑提醒:fail-fast 和线程安全
Java 集合的迭代器默认带快速失败机制,你自定义时也建议跟进:
- 在迭代器构造时记录容器的修改版本号(如
modCount),每次next()或hasNext()前比对;若发现不一致,立即抛ConcurrentModificationException - 如果容器本身是线程安全的(如用
synchronized或ReentrantLock),迭代器内部也要同步关键字段读写,避免游标错乱 - 别试图在
remove()中直接操作底层集合的remove(Object)方法——这容易绕过 fail-fast 检查,引发隐藏 bug
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










