java自定义数据结构的iterator需实现iterator接口并分离遍历逻辑,聚合类须实现iterable提供iterator()方法;推荐用私有静态内部类封装状态,hasnext()仅判断、next()推进并返回,支持懒加载与多遍历方式。

Java 中包装自定义数据结构的 Iterator,核心是实现 Iterator
明确聚合类需实现 Iterable
让自定义容器支持 for-each 和 iterator() 调用,必须实现 Iterable
- 例如树、图、链表、环形缓冲区等,只要内部有元素可访问,就可对外暴露 iterator()
- 不要在聚合类里直接写 while 循环遍历逻辑;把状态(如当前节点、栈、索引)全交给迭代器自己维护
- 推荐将迭代器设为聚合类的私有静态内部类,既封装好,又方便访问内部字段(如 root、head、elements)
按需实现 hasNext() 和 next(),不预加载
真正体现“懒加载”的地方就在两个方法的配合上:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- hasNext():只判断“是否还能拿出下一个”,不移动指针,也不计算结果;比如栈非空、索引未越界、当前节点不为 null
- next():必须返回当前有效元素,并立即推进到下一个待取位置;例如弹栈 + 压右子树最左路径、index++、current = current.next
- 避免在构造时就把所有匹配元素装进新 List——这违背了 Iterator 的延迟语义,也浪费内存
复杂结构用辅助状态机模拟遍历过程
对树、图这类非线性结构,不能靠简单计数器,得用栈、队列或递归展开状态来驱动:
- 深度优先(如中序):用 Stack 存路径,构造时压入根的最左链;next() 弹出后立刻压入其右子树的最左链
- 广度优先:用 Queue,构造时只入根;next() 出队后立即将其左右子节点入队
- 过滤迭代器:缓存一个 nextMatch 字段,hasNext() 向后扫描直到找到匹配项并赋值;next() 返回它并清空,下次再找
多个遍历方式共存要分清职责
一个自定义结构常需多种遍历能力,别混在一起:
- 命名清晰:InOrderIterator、BFSIterator、FilteredIterator,不叫 TreeIterator
- 聚合类提供多个工厂方法:tree.inOrderIterator()、tree.bfsIterator()、tree.filteredIterator(Predicate)
- 所有具体迭代器都实现同一 Iterator
接口,但内部状态与推进逻辑完全独立
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










