内部类特别适合实现迭代器模式,因其天然持有外部类引用,可直接访问私有成员且能设为private防止误用;关键需声明为私有非静态内部类、实现iterator接口、独立维护遍历状态,并每次iterator()返回新实例。

用内部类实现迭代器模式,核心是把遍历逻辑封装在容器类的私有内部类中,对外只暴露标准的 Iterator 接口(hasNext()、next()),从而彻底隐藏底层数据结构(比如链表嵌套、树形结构、多维数组等)的遍历细节。
为什么内部类特别适合实现迭代器
内部类天然持有外部类的引用,能直接访问外部类的私有字段和方法,无需暴露内部结构;同时可被设为 private,彻底防止外部误用或篡改遍历状态。这是普通独立类或静态嵌套类难以替代的优势。
关键设计要点
- 迭代器类声明为私有非静态内部类:确保它能读取容器的私有成员(如头节点、当前索引、缓存数组等)
-
实现
Iterator<t></t>接口:重写hasNext()和next(),必要时实现remove() -
遍历状态完全由内部类维护:例如链表迭代器保存当前
Node引用,跳表迭代器维护层级指针,不污染外部类状态 -
iterator()方法返回新实例:每次调用都创建独立迭代器,支持多线程/并发遍历,避免状态冲突
一个真实可用的例子:自定义双向链表的迭代器
假设你有一个私有 Node 类和 head/tail 指针的双向链表:
public class LinkedList<t> {
private Node head;
private int size;
private static class Node {
Object data;
Node next;
Node prev;
Node(Object data) { this.data = data; }
}
// ✅ 私有非静态内部类 —— 可直接访问 head, size, Node 结构
private class ListIterator implements Iterator<t> {
private Node current = head;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public T next() {
if (!hasNext()) throw new NoSuchElementException();
@SuppressWarnings("unchecked")
T data = (T) current.data;
current = current.next;
return data;
}
}
public Iterator<t> iterator() {
return new ListIterator(); // 每次返回全新迭代器
}
}
</t></t></t>
使用者只需写 for (String s : myList) 或手动调用 iterator(),完全不知道链表有没有哨兵节点、是否循环、是否懒加载——这些全被 ListIterator 封装了。
进阶技巧:支持多种遍历方式
可在同一容器中定义多个内部迭代器类,按需提供不同视角:
-
ReverseIterator:从tail往前遍历 -
FilterIterator:带条件过滤(如只返回非空字符串) -
LevelOrderIterator:若容器是树,则内部类实现层序遍历,外部仍只看到统一接口
所有这些类都可私有化,仅通过公共工厂方法(如 reverseIterator()、filteredIterator(Predicate))暴露,保持接口简洁、实现解耦。










