Skip to content

迭代器模式提供一种统一遍历集合的方式,不暴露集合的内部结构。Java 的 Iterator、增强 for 循环就是它的落地。这篇讲清它解决什么、以及 Java 里怎么用。

一、解决什么问题:遍历方式不统一

不同的集合,内部结构不同(数组、链表、树),遍历方式也不同。客户端想遍历,得知道每个集合的内部结构,代码耦合。

迭代器模式:集合提供一个统一的迭代器,客户端只认迭代器的 hasNext/next,不关心内部结构

二、核心结构

java
// 迭代器接口:统一的两个方法
interface Iterator<T> {
    boolean hasNext();
    T next();
}

// 集合接口:能返回迭代器
interface Aggregate<T> {
    Iterator<T> iterator();
}

// 具体集合:内部是数组
class ArrayAggregate<T> implements Aggregate<T> {
    private T[] items;
    public Iterator<T> iterator() {
        return new Iterator<T>() {   // 内部类实现迭代器,知道怎么遍历数组
            private int index = 0;
            public boolean hasNext() { return index < items.length; }
            public T next() { return items[index++]; }
        };
    }
}

关键:遍历逻辑(怎么从第一个到最后一个)封装在迭代器里,客户端只调 hasNext/next,完全不知道集合内部是数组还是链表。

三、Java 里的迭代器

Java 集合框架原生支持迭代器:

java
List<String> list = new ArrayList<>(List.of("a", "b", "c"));

// 显式用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

// 增强 for 循环:底层就是迭代器
for (String s : list) {
    System.out.println(s);
}

Java 8 之后,日常更多用 forEach + lambda 或 Stream,但它们底层也是迭代器的思想。

四、核心价值

  • 统一遍历:不同集合用同一种方式遍历
  • 不暴露内部:客户端不知道集合是数组还是链表
  • 解耦:遍历逻辑和集合本身分离

小结

  • 迭代器统一集合的遍历方式,不暴露内部结构
  • Java 落地:Iterator、增强 for 循环
  • 现代 Java 更多用 Stream/forEach,但思想同源

相关:《Java 集合框架详解》(了解各种集合的底层,才知道迭代器为什么重要)。