Iterator 通过接口抽象与职责分离将遍历逻辑从集合剥离,由具体实现类承担下标递增、越界检查、快速失败等细节,集合仅负责存储数据。

Java 集合框架中,Iterator 并不是“封装遍历逻辑”的工具本身,而是把遍历逻辑从集合中剥离出来、交给独立对象去实现——这个过程靠的是接口抽象与职责分离,不是简单地把 for 循环包进一个方法里。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
迭代器接口定义统一协议
Iterator 接口只规定三个核心行为:
– hasNext():判断是否还有下一个元素;
– next():取当前元素,并把内部指针推进一位;
– remove()(可选):安全删除上一次 next() 返回的元素。
它不关心数据怎么存、索引怎么算、节点怎么跳,只暴露“有没有”和“拿一个”这两个能力。所有具体遍历细节,都由实现类承担。
具体迭代器持有聚合内部状态
比如 ArrayList 的内部迭代器(ArrayList$Itr)会记录一个游标 cursor 和预期修改次数 expectedModCount:
– cursor 对应数组下标,每次 next() 就做 elementData[cursor++];
– expectedModCount 在创建时拷贝自 ArrayList 的 modCount,后续每次调用 next() 都校验二者是否一致,不一致就抛 ConcurrentModificationException。
也就是说,遍历逻辑(下标递增、越界检查、快速失败)全在具体迭代器里,集合本体只管存数据。
聚合类通过 iterator() 方法提供专属迭代器
ArrayList、LinkedList、HashSet 等都实现了 Iterable 接口,必须提供 iterator() 方法:
– ArrayList 返回的是基于数组下标的 Itr;
– LinkedList 返回的是基于节点引用的 ListItr;
– HashSet 返回的是基于哈希桶 + 链表/红黑树遍历的 KeyIterator。
客户端代码只需写 Iterator<t> it = collection.iterator()</t>,后续调用完全不依赖集合类型,底层遍历逻辑已被彻底隔离。
增强 for 循环是语法糖,底层仍走 iterator()
写 for (String s : list),编译后等价于:Iterator<string> it = list.iterator(); while (it.hasNext()) { String s = it.next(); ... }</string>
这说明:遍历逻辑的封装不是隐藏在语法里,而是真实落在 Iterator 实现类中;语法糖只是让调用更简洁,不改变职责划分。

















