Skip to content
Method约 1 分钟0 个小节更新于 2026/06/19在线编辑

迭代器模式

迭代器模式用于在不暴露集合内部结构的情况下,按顺序访问集合元素。

一句话理解:集合怎么存不用管,给我一个统一的遍历方式。

解决什么问题

不同集合内部结构不同:

  • 数组按下标访问。
  • 链表按节点访问。
  • 树需要递归遍历。
  • 数据库分页需要分批读取。

如果客户端知道每种集合的内部结构,耦合会很重。迭代器把遍历逻辑封装起来,让客户端只关心 hasNext()next()

基本结构

text
Aggregate -> createIterator()
Iterator  -> hasNext(), next()

Java 标准库已经内置了迭代器模式:

java
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

Java 示例

自定义迭代器:

java
interface Iterator<E> {
    boolean hasNext();

    E next();
}

集合对象:

java
class NameCollection {
    private final String[] names;

    NameCollection(String[] names) {
        this.names = names;
    }

    public Iterator<String> iterator() {
        return new NameIterator();
    }

    private class NameIterator implements Iterator<String> {
        private int index;

        public boolean hasNext() {
            return index < names.length;
        }

        public String next() {
            return names[index++];
        }
    }
}

使用:

java
NameCollection collection = new NameCollection(new String[]{"Java", "MySQL", "Linux"});
Iterator<String> iterator = collection.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

客户端不需要知道底层是数组、链表还是其他结构。

使用场景

  • 集合遍历。
  • 分页游标。
  • 文件逐行读取。
  • 树结构遍历。
  • 数据流消费。

优点

  • 遍历逻辑和集合结构分离。
  • 客户端访问方式统一。
  • 可以提供多种遍历方式。
  • 不暴露集合内部实现。

缺点

  • Java 已经内置,普通业务很少需要手写。
  • 自定义迭代器要处理边界、并发修改等问题。
  • 对简单集合直接使用标准迭代器即可。

实战注意

在 Java 中重点理解 IterableIterator、增强 for 循环之间的关系:

java
for (String item : list) {
    System.out.println(item);
}

增强 for 本质上就是基于迭代器。

以工程实践沉淀知识,以文档复盘成长。