java iterator接口实现迭代器模式,体现协议统一与实现隔离、可替换性与稳定性、状态自治能力三大解耦价值。

Java 的 Iterator 接口及其在集合框架中的实现,是迭代器模式最典型、最落地的工程实践。它的解耦意义不是抽象概念,而是直接体现在源码结构、调用链路和修改影响范围中。
Iterator 接口只定义“能做什么”,不规定“怎么做”
java.util.Iterator 是一个极简接口:
-
boolean hasNext()—— 问“还有没有下一个” -
E next()—— 要“下一个是什么” -
void remove()(可选)—— “删掉刚取出来的那个”
它完全不提数组索引、链表指针、树节点跳转这些细节。ArrayList 返回的 Itr、LinkedList 返回的 ListItr、TreeSet 返回的 KeyIterator,都实现了同一个接口,但内部逻辑天差地别。客户端代码写 while(it.hasNext()) it.next(),就能安全遍历所有类型——这就是解耦的第一层:**协议统一,实现隔离**。
具体集合只负责“造迭代器”,不参与“怎么走”
看 ArrayList 源码里的 iterator() 方法:
public Iterator<e> iterator() {
return new Itr();
}</e>
这个 Itr 是私有内部类,持有对 elementData[] 和 size 的引用,自己维护 cursor(当前下标)、lastRet(上一次返回位置)、expectedModCount(防并发修改)。ArrayList 本身只做一件事:把“走”的任务外包出去。它不关心 next() 是查数组还是跳 next 指针,也不管 hasNext() 是比 size 还是看 current != null。一旦你要给 ArrayList 加个“跳过 null 元素”的迭代器,只需新增一个 SkipNullIterator 类,完全不用动 ArrayList 一行代码。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
替换集合实现时,遍历代码零修改
假设你有这段业务逻辑:
List<user> users = new ArrayList();
// ... 添加数据
for (User u : users) {
process(u);
}</user>
底层编译后等价于:
Iterator<user> it = users.iterator();
while (it.hasNext()) {
User u = it.next();
process(u);
}</user>
此时若把 new ArrayList() 换成 new LinkedList() 或 new CopyOnWriteArrayList(),只要它们都正确实现了 iterator() 并返回符合 Iterator 协议的对象,上面两段代码全部无需改动。因为遍历逻辑早已从“集合怎么存”中抽离,交由各自迭代器独立承担——这正是解耦带来的**可替换性与稳定性**。
多个迭代器并存互不干扰,状态彻底分离
同一个 ArrayList 可以同时存在多个独立迭代器:
List<string> list = Arrays.asList("a", "b", "c");
Iterator<string> it1 = list.iterator();
Iterator<string> it2 = list.iterator();
it1.next(); // "a"
it2.next(); // "a" —— 不影响 it1 的 cursor
</string></string></string>
每个迭代器对象都封装了自己的遍历状态(cursor、lastRet、expectedModCount),彼此隔离。如果遍历逻辑硬编码在 ArrayList 里(比如加个 public nextElement() 方法),就只能维护一份全局状态,根本无法支持并发遍历。而迭代器模式让“状态”随对象走,天然支持多实例、多上下文——这是解耦带来的**状态自治能力**。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










