Java 中的迭代器是集合框架(Collection Framework)中的一个重要组件,它提供了一种遍历集合中元素的统一方式,而不需要暴露集合的底层实现。迭代器模式在软件开发中是一个常用的设计模式,旨在提供一种方法,可以按顺序访问一个聚合对象中的各个元素,而又无需暴露其内部结构。
在 Java 中,Iterator
是一个接口,位于 java.util
包中。它定义了三个核心方法:
hasNext(): 该方法返回一个布尔值,用于判断集合中是否还有未被迭代的元素。
boolean hasNext()
next(): 该方法返回集合中的下一个元素。如果没有更多的元素可以返回,则会抛出 NoSuchElementException
。
E next()
remove(): 该方法用于删除迭代器最近返回的元素。调用此方法是可选的,并且必须在调用 next()
之后进行。注意,一旦调用了 remove()
,它将影响底层集合。
void remove()
迭代器适用于众多集合类,包括 ArrayList
, LinkedList
, HashSet
, TreeSet
, HashMap
等。我们通常使用这些集合的 iterator()
方法获取一个迭代器实例。
以下是一个使用迭代器遍历 ArrayList
的简单例子:
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
// 创建一个ArrayList并添加元素
ArrayList<String> list = new ArrayList<>();
list.add("Element 1");
list.add("Element 2");
list.add("Element 3");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 使用迭代器遍历集合
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
在 Java 集合框架中,许多集合类都实现了 Iterable
接口,这意味着它们都可以返回一个 Iterator
实例。Iterable
接口仅包含一个方法:
Iterator<T> iterator();
这使得 for-each
循环得以实现,因为 for-each
本质上是使用迭代器进行遍历的。
使用迭代器和使用 for-each
循环在很多情况下是等价的,但两者之间存在一些差异:
迭代器提供更多控制: 迭代器允许在遍历过程中删除元素,而 for-each
不允许。
可用于并行修改: 迭代器更为安全,因为它检测到并发修改时(不是通过迭代器进行的集合内容修改)会抛出 ConcurrentModificationException
,从而保护集合的完整性。
remove()
方法是迭代器提供的一个功能,用于在迭代过程中移除元素。需要注意的是,remove()
方法必须在 next()
方法之后被调用。
以下是示例代码展示如何在遍历过程中删除元素:
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorRemoveExample {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
if (number % 2 == 0) {
iterator.remove(); // 移除偶数
}
}
System.out.println(numbers); // 输出:[1, 3]
}
}
对于 List
接口,有一个更加丰富的迭代器接口,称为 ListIterator
。它继承了 Iterator
接口,并增加了一些额外的功能:
双向遍历: 使用 ListIterator
,你可以向前或向后遍历列表。
boolean hasPrevious()
E previous()
获取当前索引: 有方法可以获取到当前元素的索引。
int nextIndex()
int previousIndex()
添加元素: 可以在遍历时添加元素。
void add(E e)
以下是 ListIterator
的一个简单示例:
import java.util.ArrayList;
import java.util.ListIterator;
public class ListIteratorExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
ListIterator<String> itr = list.listIterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
// 反向遍历
while (itr.hasPrevious()) {
System.out.println(itr.previous());
}
}
}
迭代器是 Java 集合框架中的重要工具,它使得遍历集合变得简单和统一。通过提供抽象的遍历接口,Java 使得实现上可以隐藏底层的复杂性,从而提高了代码的可维护性和可读性。在现代 Java 编程中,尽管 for-each
循环非常流行且简洁,但迭代器依然在需要更精细控制的场景下无可替代,特别是在需要并发修改集合时。理解和善用 Java 迭代器是掌握集合框架的重要一步。