## Java中的迭代器
### 1. 介绍
迭代器(Iterator)是Java集合框架中一个重要的接口,用于遍历集合中的元素。迭代器提供了一种通用的方法来访问集合中的每个元素,而不需要了解集合的底层实现。Java中的迭代器支持集合的顺序遍历,同时还提供了一些基本的集合操作方法。
### 2. 迭代器的基本概念
Java中的迭代器接口位于`java.util`包中,主要提供了以下三个方法:
- `boolean hasNext()`: 如果仍有元素可以迭代,则返回 `true`。
- `E next()`: 返回迭代的下一个元素。
- `void remove()`: 从集合中移除由迭代器返回的最后一个元素(可选操作)。
除了 `Iterator` 接口,Java 还提供了一个增强版的迭代器接口 `ListIterator`,用于双向遍历 `List` 集合,并支持更丰富的操作。
### 3. 迭代器的实现
Java中的每个集合类(如 `ArrayList`、`HashSet`、`LinkedList` 等)都实现了 `Iterable` 接口,这意味着它们都提供了 `iterator()` 方法来返回一个迭代器对象。以下是一些常见集合类如何使用迭代器的示例。
#### 3.1 使用 `ArrayList` 的迭代器
```java
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListIteratorExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
```
#### 3.2 使用 `HashSet` 的迭代器
```java
import java.util.HashSet;
import java.util.Iterator;
public class HashSetIteratorExample {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next();
System.out.println(element);
}
}
}
```
#### 3.3 使用 `LinkedList` 的迭代器
```java
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListIteratorExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Dog");
list.add("Cat");
list.add("Horse");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
```
### 4. `ListIterator` 接口
`ListIterator` 是 `Iterator` 接口的子接口,提供了更多的方法来支持双向遍历和修改列表中的元素。`ListIterator` 仅适用于 `List` 类型的集合(如 `ArrayList`、`LinkedList`)。
`ListIterator` 的方法包括:
- `boolean hasNext()`: 如果列表中有下一个元素,则返回 `true`。
- `E next()`: 返回列表中的下一个元素。
- `boolean hasPrevious()`: 如果列表中有上一个元素,则返回 `true`。
- `E previous()`: 返回列表中的上一个元素。
- `int nextIndex()`: 返回下一个元素的索引。
- `int previousIndex()`: 返回上一个元素的索引。
- `void remove()`: 移除由迭代器返回的最后一个元素。
- `void set(E e)`: 用指定的元素替换最后一次调用 `next()` 或 `previous()` 返回的元素。
- `void add(E e)`: 将指定的元素插入列表中。
#### 使用 `ListIterator` 示例
```java
import java.util.ArrayList;
import java.util.ListIterator;
public class ListIteratorExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Red");
list.add("Green");
list.add("Blue");
ListIterator<String> listIterator = list.listIterator();
System.out.println("Forward traversal:");
while (listIterator.hasNext()) {
String element = listIterator.next();
System.out.println(element);
}
System.out.println("\nBackward traversal:");
while (listIterator.hasPrevious()) {
String element = listIterator.previous();
System.out.println(element);
}
}
}
```
### 5. 迭代器的实际应用
迭代器不仅用于遍历集合,还可以用于在遍历的同时进行集合的修改。
#### 5.1 在遍历过程中移除元素
使用迭代器可以安全地在遍历过程中移除集合中的元素,而不会抛出 `ConcurrentModificationException`。
```java
import java.util.ArrayList;
import java.util.Iterator;
public class RemoveElementExample {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next();
if (element % 2 == 0) {
iterator.remove();
}
}
System.out.println("List after removal: " + list);
}
}
```
#### 5.2 在遍历过程中修改元素
`ListIterator` 提供了 `set` 和 `add` 方法,可以在遍历过程中修改和添加元素。
```java
import java.util.ArrayList;
import java.util.ListIterator;
public class ModifyElementExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String element = listIterator.next();
if (element.equals("two")) {
listIterator.set("TWO");
}
}
System.out.println("List after modification: " + list);
}
}
```
### 6. 迭代器与for-each循环
Java 提供了增强的 for 循环(for-each 循环),它是基于迭代器的语法糖,简化了遍历集合的代码。for-each 循环内部实际使用了迭代器,但代码更加简洁和易读。
```java
import java.util.ArrayList;
public class ForEachLoopExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
for (String element : list) {
System.out.println(element);
}
}
}