Java Iterator(迭代器)
Iterator 是 Java 集合框架中的一个接口,提供了一种遍历集合(如 List、Set 等)元素的方式,而不需要直接暴露集合的内部结构。Iterator 是实现集合遍历的标准方式,通过 Iterator 可以逐个访问集合中的元素。
1. Iterator 接口的基本方法
Iterator 接口主要定义了以下三个方法:
hasNext():判断集合中是否还有下一个元素。next():返回集合中的下一个元素。如果没有下一个元素,则抛出NoSuchElementException。remove():删除迭代器当前指向的元素,通常是通过next()获取的元素。此方法可选。
Iterator<E> iterator = collection.iterator();
while (iterator.hasNext()) {
E element = iterator.next();
// 处理元素
}
2. 使用 Iterator 遍历集合
Iterator 接口最常见的用法是用来遍历集合中的元素。通过以下步骤实现:
- 使用集合的
iterator()方法获取迭代器。 - 使用
hasNext()检查是否还有元素。 - 使用
next()获取当前元素。 - 如果需要删除当前元素,可以调用
remove()。
示例:遍历 List 集合
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
// 创建一个 List 集合
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 获取 Iterator 对象
Iterator<String> iterator = list.iterator();
// 使用 Iterator 遍历集合
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
}
}
输出:
Apple
Banana
Cherry
示例:遍历 Set 集合
import java.util.HashSet;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
// 创建一个 HashSet 集合
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
// 获取 Iterator 对象
Iterator<String> iterator = set.iterator();
// 使用 Iterator 遍历集合
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
}
}
输出:
Apple
Banana
Cherry
3. remove() 方法
remove() 方法用于删除迭代器当前指向的元素。这个方法可以在遍历过程中删除元素,但是它只能删除通过 next() 返回的元素。直接调用 remove() 时,如果没有先调用 next(),会抛出 IllegalStateException。
示例:使用 remove() 删除元素
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorRemoveExample {
public static void main(String[] args) {
// 创建一个 List 集合
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 获取 Iterator 对象
Iterator<String> iterator = list.iterator();
// 遍历集合并删除特定元素
while (iterator.hasNext()) {
String fruit = iterator.next();
if ("Banana".equals(fruit)) {
iterator.remove(); // 删除 "Banana"
}
}
// 打印删除后的集合
System.out.println(list); // 输出 [Apple, Cherry]
}
}
输出:
[Apple, Cherry]
4. Iterator 的特点和优势
- 统一的接口:
Iterator提供了统一的遍历集合的接口,支持集合的统一遍历操作。 - 不暴露集合的内部结构:
Iterator允许遍历集合而不需要暴露集合的内部实现,增强了封装性。 - 支持删除操作:
Iterator提供了在遍历过程中删除元素的功能,这对于某些操作非常方便。
5. 与传统 for 循环的对比
传统的 for 循环(使用下标)和增强型 for 循环(for-each)也可以用来遍历集合,但它们无法在遍历过程中删除元素。
- 传统 for 循环:只适用于
List,不适用于Set。 - 增强型 for 循环(
for-each):适用于List、Set等,但无法删除元素。 - Iterator:适用于所有实现了
Collection接口的类(如List、Set等),并且可以在遍历时删除元素。
使用 for-each 遍历 List
import java.util.ArrayList;
import java.util.List;
public class ForEachExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
// 使用 for-each 遍历
for (String fruit : list) {
System.out.println(fruit);
}
}
}
使用 Iterator 遍历 Set 并删除元素
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class IteratorExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
// 使用 Iterator 遍历并删除元素
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
if ("Banana".equals(fruit)) {
iterator.remove(); // 删除元素
}
}
System.out.println(set); // 输出 [Apple, Cherry]
}
}
6. Iterator 的适用场景
- 遍历集合:当需要遍历集合中的元素时,
Iterator是一种通用的遍历方式。 - 修改集合结构:当需要在遍历时删除或更新元素时,
Iterator提供了安全的方式(特别是删除操作)。 - 跨多种集合类型:
Iterator可用于任何实现了Collection接口的集合,适合用作跨不同集合类型的遍历工具。
7. 注意事项
- 迭代器在遍历时删除元素时,必须调用
next()方法,且只能删除next()返回的当前元素。如果调用remove()时没有调用next(),会抛出IllegalStateException。 Iterator不支持并发修改操作,除非集合是线程安全的。即一个线程遍历时,另一个线程不应该修改集合,否则会抛出ConcurrentModificationException。
小结
Iterator 提供了一种统一、安全的方式来遍历集合中的元素,并允许在遍历过程中删除元素。它适用于所有实现了 Collection 接口的类,是进行集合遍历时的首选方式。更多详细内容请关注其他相关文章。