Java 在CopyOnWriteArrayList上迭代时不支持操作异常

Java 在CopyOnWriteArrayList上迭代时不支持操作异常,java,collections,concurrency,iterator,copyonwritearraylist,Java,Collections,Concurrency,Iterator,Copyonwritearraylist,我在一本书中看到了以下陈述: 对基于写入的迭代器或列表迭代器的副本调用的任何变异方法(如添加、设置或删除)将抛出不支持操作异常 List<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(4, 3, 52)); System.out.println("Before " + list); for (Integer item : list) { System.out.println(item + " ")

我在一本书中看到了以下陈述:

对基于写入的
迭代器
列表迭代器
的副本调用的任何变异方法(如添加、设置或删除)将抛出
不支持操作异常

List<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(4, 3, 52));
System.out.println("Before " + list);
for (Integer item : list) {
    System.out.println(item + " ");
    list.remove(item);
}
System.out.println("After " + list);
但是,当我运行以下代码时,它工作正常,不会抛出
UnsupportedOperationException

List<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(4, 3, 52));
System.out.println("Before " + list);
for (Integer item : list) {
    System.out.println(item + " ");
    list.remove(item);
}
System.out.println("After " + list);

为什么我在使用
删除
方法修改给定的
列表时没有得到异常?

您在列表本身上调用
删除
,这很好。文档指出,在列表的迭代器上调用
remove
将引发
UpsupportedOperationException
。例如:

Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
    Integer item = iter.next(); 
    System.out.println(item + " ");
    iter.remove(); // Will throw an UpsupportedOperationException
}
Iterator iter=list.Iterator();
while(iter.hasNext()){
整数项=iter.next();
System.out.println(项+“”);
iter.remove();//将引发UpsupportedOperationException
}

穆雷尼克的回答看起来不错。然而,如果你深入研究这个问题-

如果使用
阵列列表

  • 使用
    循环和列表
    删除(当前索引)
    方法,效果很好
并使用
迭代器
方法-

  • 使用迭代器
    remove()
    方法代替list
    remove()
    ,效果很好
  • 如果使用list
    remove()
    方法,则抛出ConcurrentModificationException
如果在多线程环境中-

使用CopyOnWriteArrayList

  • 使用list
    remove(当前元素)
  • 使用
    迭代器
    列表迭代器
    remove()
    方法,它抛出
    不支持操作异常
看看下面的例子-

import java.util.*;
import java.util.concurrent.*;
public class AvoidCMEExample {
   public static void main(String args[]) {
        List<String> listOfBooks = new ArrayList<>();  
       listOfBooks.add("Programming Pearls");
       listOfBooks.add("Clean Code");
       listOfBooks.add("Effective Java");
       listOfBooks.add("Code Complete");
       System.out.println("List before : " + listOfBooks);
       /*for(int i=0; i<listOfBooks.size(); i++){
           String book = listOfBooks.get(i);
           if(book.contains("Programming")){
               System.out.println("Removing " + book);
               listOfBooks.remove(i); // works fine
           }
       }*/
       Iterator<String> itr = listOfBooks.iterator();
       while(itr.hasNext()){
            String book = itr.next();
            if(book.contains("Programming")){
               System.out.println("Removing " + book);
               //listOfBooks.remove(book); // will throw CME
               itr.remove(); // using iterator remove(), it works fine
           }
       }
       System.out.println("List after : " + listOfBooks);
       
       List<String> list = new CopyOnWriteArrayList<>(); 
       list.add("B"); list.add("W"); list.add("Q"); list.add("S");
       System.out.println("\n\nList before : " + list);
       Iterator<String> itr1 = list.iterator();
       while(itr1.hasNext()){
            String book = itr1.next();
            if(book.contains("Q")){
               System.out.println("Removing " + book);
               list.remove(book); // works fine on list object remove()
               itr1.remove(); // throws UnsupportedOperationException on iterator, ListIterator obj
           }
       }
       System.out.println("List after : " + list);       
   }
}
import java.util.*;
导入java.util.concurrent.*;
公共类avoidcMee示例{
公共静态void main(字符串参数[]){
listOfBooks=newarraylist();
添加(“编程珍珠”);
添加(“干净代码”);
add(“有效Java”);
添加(“代码完成”);
System.out.println(“前面的列表:+图书列表”);

/*对于(int i=0;i)您从不在迭代器或ListIterator上调用任何方法。您在
CopyOnWriteArrayList
上调用
remove
,而不是在您引用的文本所提到的迭代器上。它是
UnsupportedOperationException
,而不是
UpsupportedOperationException