Java 基础(2)—使用 Iterator 发生 ConcurrentModificationException 异常

代码如下

List 集合进行遍历,在满足某个条件时对集合进行修改,代码如下:

public class MyListDemo {
    
    
  public static void main(String[] args) {
    
    
  
    List<String> list = Lists.newArrayList("a", "b", "c", "d");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
    
    
      String next =  iterator.next();
      if (next.equals("d")) {
    
    
        iterator.set("f");
      }
    }
    System.out.println("list = " + list);
  }
}

最终输入结果如下:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
	at java.util.ArrayList$Itr.next(ArrayList.java:861)
	at org.apache.ibatis.gwmtest.current.MyListDemo.main(MyListDemo.java:19)

Process finished with exit code 1

发现会抛出 ConcurrentModificationException 异常,那么怎么才可以进行修改呢?可以借助 Iterator 接口的子类 ListIterator 操作,代码如下:

public class ListDemo {
    
    
  public static void main(String[] args) {
    
    
    List<String> list = Lists.newArrayList("a", "b", "c", "d");

    ListIterator<String> iterator = list.listIterator();

    while (iterator.hasNext()) {
    
    
      String next =  iterator.next();
      if (next.equals("d")) {
    
    
        iterator.set("f");
        iterator.add("g");
      }
    }
    System.out.println("list = " + list);
  }
}

输出结果:

list = [a, b, c, f, g]

对集合的操作都是通过 ListIterator 对象,而不是 List 本身。

使用 ListIterator 可以避免 ConcurrentModificationException 异常,但也不是没有安全隐患?

下面列举了一些安全隐患:

  1. 遍历过程中的添加或删除操作可能导致错误:当使用 ListIterator 添加或删除元素时,可能会影响遍历过程中的枚举顺序,因此不推荐在遍历过程中进行添加和删除操作。

  2. 双向遍历:ListIterator 支持双向遍历,这意味着在遍历过程中可以向前和向后移动,如果不小心在遍历过程中修改了集合,可能会导致错误。

  3. 并发修改:ListIterator 是一个单线程工具,不支持并发修改,因此如果多个线程同时对集合进行修改,可能会导致不一致性问题。

因此,即使使用 ListIterator,仍然需要注意遍历过程中的集合操作,以确保程序的正确性。

猜你喜欢

转载自blog.csdn.net/qq_35971258/article/details/129028008