Java Iterator(迭代器)
                           
天天向上
发布: 2025-03-02 18:45:06

原创
457 人浏览过

Iterator 是 Java 集合框架中的一个接口,提供了一种遍历集合(如 ListSet 等)元素的方式,而不需要直接暴露集合的内部结构。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 接口最常见的用法是用来遍历集合中的元素。通过以下步骤实现:

  1. 使用集合的 iterator() 方法获取迭代器。
  2. 使用 hasNext() 检查是否还有元素。
  3. 使用 next() 获取当前元素。
  4. 如果需要删除当前元素,可以调用 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):适用于 ListSet 等,但无法删除元素。
  • Iterator:适用于所有实现了 Collection 接口的类(如 ListSet 等),并且可以在遍历时删除元素。

使用 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 接口的类,是进行集合遍历时的首选方式。更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *