Iterator 封装细节的核心是隐藏数据存储与遍历实现,仅暴露 hasNext() 和 next() 接口;通过私有内部类承载私有逻辑、独立维护遍历状态,并借助 fail-fast 机制隐式管理并发修改检测。

Iterator 封装细节的核心,是让调用方完全不知道数据怎么存、怎么取,只管“有没有下一个”和“取出来”。它不暴露数组下标、链表指针、哈希桶结构、树节点关系,也不透露遍历是递归还是迭代、是顺序还是跳步。
通过接口隔离实现细节
Iterator 接口只定义 hasNext() 和 next() 两个基础方法,没有字段、没有构造器、不依赖任何具体容器类型。客户端代码只面向这个接口编程:
- 调用
hasNext()时,不关心背后是比index 、查 <code>current != null,还是判断栈是否为空 - 调用
next()时,不涉及array[i++]、node.data、entry.getValue()这类具体访问表达式 - 哪怕底层是二叉树中序遍历,对外也只表现为“一个接一个吐元素”,用户无需压栈、递归或维护游标状态
内部类承载私有逻辑,不对外可见
Java 中常见做法是用 private 非静态内部类 实现 Iterator:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 非静态 → 自动持有外部容器实例引用,可直接读
head、size、table[]等私有字段,无需暴露 getter - 私有 → 外部无法 new、继承或强转,连类名都不可见,彻底切断绕过封装的路径
- 每次
iterator()调用都返回新实例 → 每个迭代器独立维护自己的current、index或stack,互不干扰
遍历状态由迭代器自己管理
容器本身不保存任何遍历相关字段,所有“走到哪了”都封装在迭代器实例内部:
立即学习“Java免费学习笔记(深入)”;
- ArrayList 的迭代器记的是
int cursor,不是容器的size - LinkedList 的迭代器持的是
Node current引用,不是容器的first或last - HashMap 的迭代器维护的是
int index(桶索引)和Node next(当前桶内节点),不暴露Node[] table数组 - 即使要支持
remove(),也是靠迭代器缓存上一次next()返回的节点或索引,而不是让容器去查
fail-fast 机制进一步隐藏修改逻辑
modCount 和 expectedModCount 的比对,把“容器是否被并发修改”的判断逻辑封在迭代器里:
- 用户调用
next()时触发检查,但完全不知晓 modCount 是什么、怎么更新 - 异常
ConcurrentModificationException的抛出时机和原因由迭代器控制,容器只负责在增删时自增 modCount - 这种协作不暴露容器的版本号机制,也不要求用户理解“结构性修改”的定义

















