迭代器
约 820 字大约 3 分钟
2025-09-03
迭代器的概念
迭代器是一种设计模式,它提供了一种统一的方式来顺序访问聚合对象中各个元素,而无需暴露该对象的内部表示。在 Java 中,迭代器主要通过 Iterator 接口实现,用于遍历各种集合类型。
迭代器的实现原理
集合的遍历方式
Java 集合的常见遍历方式包括:
- 迭代器遍历 (Iterator Traversal):显式使用
Iterator对象的hasNext()和next()方法进行遍历。 - 增强 For 循环遍历 (Enhanced For-Loop Traversal):
for-each循环,是迭代器遍历的语法糖。 - Lambda 表达式遍历 (Lambda Expression Traversal):结合 Java 8 Stream API 或
forEach方法进行遍历。
增强 For 循环的底层实现
增强 For 循环的底层实现原理就是调用了集合的迭代器方法。任何实现了 Iterable 接口的类都可以使用增强 For 循环,Iterable 接口要求实现 iterator() 方法,该方法返回一个 Iterator 对象。
迭代器的优势
- 统一遍历接口:迭代器提供了一种统一的、标准化的方式来遍历不同类型的集合(如
List、Set、Map等),而无需了解或暴露底层数据结构的具体实现细节。 - 解耦:将集合的遍历操作与集合本身解耦,使得集合的内部结构变化不会影响遍历代码。
- 设计模式:迭代器模式是 GoF 23 种设计模式之一,其核心思想是提供一种顺序访问聚合对象元素的方法,同时隐藏其底层表示。
迭代器出现的原因
如果没有迭代器,每当需要遍历一种新的数据结构时,开发人员就必须学习并掌握其特有的遍历机制。例如,对于数组、链表、哈希表等不同的底层实现,可能需要不同的遍历逻辑。迭代器的引入,使得无论底层数据结构如何变化,只需掌握一种通用的迭代器遍历方式即可,极大地简化了开发。
Iterator 接口定义
在 Java 中,Iterator 接口定义了迭代器的基本行为:
public interface Iterator<E> {
boolean hasNext(); // 检查是否还有下一个元素
E next(); // 获取下一个元素
void remove(); // 删除当前元素(可选操作)
}迭代器遍历的内部工作原理
每个具体的集合类(如 ArrayList、LinkedList、HashSet、HashMap 等)都会通过其内部类实现 Iterator 接口,并结合自身的数据结构特点来定制 hasNext()、next() 和 remove() 方法的逻辑。
ArrayList:其内部迭代器通常利用数组的索引来追踪当前元素的位置,hasNext()检查索引是否超出数组边界,next()返回当前索引位置的元素并递增索引。LinkedList:其内部迭代器利用链表的节点指针(Node引用)来遍历,hasNext()检查当前节点是否为null,next()返回当前节点的值并将指针移动到下一个节点。HashMap:HashMap的迭代器通常会遍历其内部的哈希桶数组(Node[] table),并在每个桶内遍历链表或红黑树结构。