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()
方法代替listremove()
,效果很好
- 如果使用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
。