目录
- Java的迭代器Iterator
- 迭代器的作用
- Iterator的核心方法和标准流程
- 迭代器的优势
- 自定义迭代器
- 注意事项
- 总结
Java的迭代器Iterator
在Java集合框架中,Iterator
(迭代器)是一种用于遍历集合元素的抽象接口,为各种不同的集合提供了统一的遍历方式。
迭代器的作用
for each
循环是Java中遍历集合的常用方式,例如:
List<String> fruits = List.of("Apple", "Orange", "Pear");
for (String fruit : fruits) {System.out.println(fruit);
}
实际上,编译器会将上述for each
循环自动转换为基于Iterator
的遍历代码:
for (Iterator<String> it = fruits.iterator(); it.hasNext(); ) {String fruit = it.next();System.out.println(fruit);
}
这种转换揭示了迭代器的作用:为所有集合提供统一的访问接口,而无需暴露集合的内部存储结构。
Iterator的核心方法和标准流程
Iterator
接口定义了三个核心方法:
boolean hasNext()
:判断是否还有下一个元素E next()
:返回下一个元素并移动指针void remove()
:删除当前元素(可选操作)
使用迭代器遍历集合的标准流程:
- 通过
hasNext()
判断是否有未遍历的元素 - 通过
next()
获取元素并移动指针 - 重复上述步骤直到遍历完成
迭代器的优势
与直接使用集合的特定方法(如get(int)
)遍历相比,迭代器的好处在于统一和高效:
-
统一性:无需集合的内部存储结构,无论集合类型是
ArrayList
、LinkedList
还是HashSet
,都可以用相同的迭代器代码遍历 -
高效性:迭代器由集合对象内部创建,集合可以根据自身特点实现最高效的遍历算法。例如:
ArrayList
的迭代器可直接通过索引访问元素LinkedList
的迭代器则通过节点指针移动,避免了get(int)
的低效访问
自定义迭代器
如果我们需要创建自定义集合类并支持for each
循环,只需完成两个步骤:
- 让集合类实现
Iterable
接口,重写iterator()
方法返回一个Iterator
实例 - 实现
Iterator
接口,定义具体的遍历逻辑
下面是一个倒序遍历集合的自定义迭代器示例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;// 自定义可迭代集合
class ReverseList<T> implements Iterable<T> {private List<T> innerList = new ArrayList<>();public void add(T element) {innerList.add(element);}@Overridepublic Iterator<T> iterator() {// 返回自定义迭代器return new ReverseIterator();}// 内部类实现迭代器private class ReverseIterator implements Iterator<T> {private int currentIndex;public ReverseIterator() {// 从最后一个元素开始currentIndex = innerList.size() - 1;}@Overridepublic boolean hasNext() {return currentIndex >= 0;}@Overridepublic T next() {T element = innerList.get(currentIndex);currentIndex--; // 向前移动指针return element;}}
}// 使用示例
public class Main {public static void main(String[] args) {ReverseList<String> list = new ReverseList<>();list.add("First");list.add("Second");list.add("Third");// 支持for each循环for (String s : list) {System.out.println(s); // 输出Third、Second、First}}
}
在这个例子中:
ReverseList
实现了Iterable
接口,提供了iterator()
方法- 内部类
ReverseIterator
实现了具体的倒序遍历逻辑 - 调用者可以像使用普通集合一样通过
for each
循环遍历
注意事项
-
并发修改问题:在迭代过程中如果直接修改集合(如调用
add()
、remove()
),会导致ConcurrentModificationException
。如需修改,应使用迭代器自身的remove()
方法 -
空元素处理:迭代器可以处理
null
元素,但需注意next()
返回null
时可能是正常元素,需结合hasNext()
判断
总结
Iterator
是一种抽象的数据访问模型,它的价值在于:
- 为各种集合提供了统一的访问方式
- 使调用者对集合内部结构一无所知
- 允许集合类根据自身特点实现最优遍历算法
Java提供了标准的迭代器模型,即集合类实现java.util.Iterable
接口,返回java.util.Iterator
实例。