📌 目录

  1. 什么是 Iterator?
  2. Iterator 的工作原理
  3. 创建和使用 Iterator
  4. Iterator 常用方法
    • 4.1 hasNext()
    • 4.2 next()
    • 4.3 remove()
  5. Iterator 和 ListIterator 的区别
  6. Iterator 性能
  7. 总结
  8. 参考资料
  9. 出站链接

1. 什么是 Iterator?

Iterator 是 Java 集合框架中的一个接口,用于遍历集合中的元素。通过 Iterator,我们可以以一种统一的方式访问各种集合类型(如 ListSet 等)中的元素,而无需关心集合的具体实现。它提供了一种可控的遍历方式,能够避免使用传统的索引方式访问集合元素。

Iterator 主要用于以下场景:

  • 遍历集合中的元素。
  • 删除集合中的元素。
  • 通过方法提供更好的控制,避免使用索引遍历时可能出现的并发修改问题。

2. Iterator 的工作原理

Iterator 提供了一种通过顺序访问集合元素的方法。每个集合类都可以通过 iterator() 方法返回一个 Iterator 对象,用于对该集合进行遍历。迭代器提供了三种主要操作:

  1. hasNext():检查集合中是否还有元素。
  2. next():返回集合中的下一个元素。
  3. remove():删除当前元素。

3. 创建和使用 Iterator

使用 Iterator 遍历 List 集合

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");
        list.add("C++");

        Iterator<String> iterator = list.iterator();  // 获取 Iterator 对象
        while (iterator.hasNext()) {  // 判断是否有下一个元素
            String element = iterator.next();  // 获取下一个元素
            System.out.println(element);  // 打印元素
        }
    }
}

使用 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("Java");
        set.add("Python");
        set.add("C++");

        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
}


4. Iterator 常用方法

4.1 hasNext()

  • 功能:检查集合中是否还有未遍历的元素。
  • 返回值:如果集合中有下一个元素,则返回 true,否则返回 false
boolean hasNext = iterator.hasNext();

4.2 next()

  • 功能:返回集合中的下一个元素,并将指针移动到下一个元素。
  • 返回值:返回下一个元素。
  • 异常:如果没有下一个元素,调用 next() 方法会抛出 NoSuchElementException 异常。
String element = iterator.next();

4.3 remove()

  • 功能:删除集合中的当前元素,即最后一次通过 next() 返回的元素。
  • 注意remove() 方法只能在 next() 方法之后调用。如果没有调用 next(),调用 remove() 会抛出 IllegalStateException 异常。
iterator.remove();  // 删除当前元素


5. Iterator 和 ListIterator 的区别

特性IteratorListIterator
支持的集合类型List, Set, Queue仅支持 List
方向单向遍历(从前到后)双向遍历(从前到后和从后到前)
增强功能不支持插入和修改集合支持插入、删除、修改集合
支持的位置指针操作不支持支持向前和向后移动指针
  • ListIteratorIterator 的一个子接口,除了支持单向遍历,还支持双向遍历。
  • ListIterator 提供更多的操作,例如 add()(在当前元素前插入元素)、set()(修改当前元素的值)等。

6. Iterator 性能

Iterator 的性能通常与集合本身的实现有关。例如,ArrayList 提供的 Iterator 性能非常高,因为它直接基于数组存储数据;而对于 LinkedListIterator 的性能会稍微差一些,因为它需要通过链表节点进行遍历。

在遍历集合时,Iterator 通常比传统的基于索引的遍历方法(例如使用 for 循环)更具优势,特别是在需要删除元素的情况下。通过 Iterator 删除元素不会引起 ConcurrentModificationException,而直接修改集合可能会导致此异常。


7. 总结

  • Iterator 提供了一种统一的方式来遍历 Collection 中的元素,避免了直接使用索引的缺点。
  • 它是用于集合元素遍历和删除的理想选择,特别是在需要对集合进行修改时。
  • Iterator 的主要方法有:hasNext()next()remove(),而 ListIterator 是其子接口,提供了更多的操作。
  • Iterator 在多线程环境下使用时要特别注意,并发修改会导致 ConcurrentModificationException 异常。

8. 参考资料


9. 出站链接