为何 Java 中 Iterator 不支持添加元素?

Java Q&A Hub 使用 GPT-4o-mini 回答

问题:

为何没有像Iterator.add()这样的方法,向集合中添加元素?

回答:

在 Java 中,Iterator 接口的设计初衷是为了提供一种遍历集合的方式,而不是修改集合的结构。Iterator 主要用于在遍历集合时访问元素,而不支持在遍历过程中添加或删除元素。这是为了避免在遍历过程中出现并发修改异常(ConcurrentModificationException),从而保证遍历的安全性和一致性。

如果你需要在遍历集合的同时添加元素,可以考虑以下几种方法:

  1. 使用 ListIteratorListIteratorIterator 的一个子接口,提供了 add() 方法,可以在遍历 List 时添加元素。示例代码如下:

    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    ListIterator<String> iterator = list.listIterator();
    while (iterator.hasNext()) {
        String element = iterator.next();
        if (element.equals("B")) {
            iterator.add("D"); // 在遍历时添加元素
        }
    }
    
  2. 使用 for-each 循环:在遍历集合时,可以先将要添加的元素存储在一个临时集合中,遍历完成后再将这些元素添加到原集合中。

    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    List<String> toAdd = new ArrayList<>();
    for (String element : list) {
        if (element.equals("B")) {
            toAdd.add("D"); // 收集要添加的元素
        }
    }
    list.addAll(toAdd); // 遍历完成后添加元素
    
  3. 使用 Stream API:在 Java 8 及以上版本中,可以使用 Stream API 进行更复杂的操作,但这通常不涉及直接在遍历过程中修改集合。

总之,Iterator 的设计是为了提供安全的遍历,而不是修改集合。如果需要在遍历时添加元素,可以使用 ListIterator 或者其他方法来实现。