java-迭代器

发布于:2024-07-03 ⋅ 阅读:(17) ⋅ 点赞:(0)

## 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);
        }
    }
}