java中用私有非静态内部类实现迭代器,本质是将遍历逻辑封装在容器内部,对外仅暴露标准iterator接口;其非静态特性可直接访问外部类私有字段,私有性则阻止外部直接实例化,确保封装性与安全性。

Java 中用内部类实现迭代器,本质是把遍历逻辑“藏进容器内部”,对外只留一个干净的 Iterator 接口。用户调用 iterator() 时,拿到的是标准接口,完全不知道背后是链表跳指针、树中序递归,还是多维数组的嵌套循环。
私有非静态内部类是关键载体
迭代器必须声明为 private 且 非static,这是实现隐藏的前提:
- 非静态 → 天然持有外部类实例引用,能直接读取
head、size、Node等私有字段,无需 getter 暴露结构 - 私有 → 外部代码无法 new 它、继承它、甚至看不到它,彻底切断误用路径
- 不暴露构造器 → 用户只能通过外部类的
public Iterator<t> iterator()</t>获取,控制权始终在容器手里
遍历状态由内部类独立维护
每次调用 iterator() 都应返回一个新实例,避免多个迭代器互相干扰:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 内部类自己保存当前节点(如
private Node current)、索引位置或游标状态 - 外部类不存任何遍历相关字段,
hasNext()和next()全靠内部状态驱动 - 支持并发遍历:两个线程同时调用
list.iterator(),得到的是彼此隔离的迭代器实例
对外只暴露 Iterator 接口契约
用户看到的只有标准方法,底层实现可随时替换而不影响调用方:
-
hasNext()返回布尔值,不透露是查空指针、比索引、还是判断栈是否为空 -
next()返回泛型元素,不暴露是取node.data、array[i]还是计算生成的中间值 - 不提供
reset()、peek()等扩展方法,保持接口精简,符合 JDK 规范
封装带来的实际好处
这种设计不是炫技,而是解决真实问题:
- 数据结构升级时透明:比如把链表换成跳表,只要内部类重写遍历逻辑,外部代码一行不用改
- 安全性提升:无法绕过容器直接操作内部节点,防止破坏结构一致性
- API 更干净:用户不需要理解
Node、TreeNode或缓存数组,只关心“怎么取下一个” - 便于统一管控:可在
next()中统一加空值检查、日志记录或权限校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










