【发布时间】:2018-06-28 16:58:00
【问题描述】:
考虑一个 ArrayList,其中用于 Iterator 和 List 迭代器操作,当一个列表被迭代并且每当 Collection 对象发生变化时,它就会抛出 ConcurrentModificationException,如下所示:
package JavaImpPrograms;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Wdfds {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Iterator it=list.iterator();
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
list.remove(0);
}
System.out.println(list); } }
Iterator 对象更新时不是这种情况,如下所示:
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
it.remove();
}
System.out.println(list); } }
当涉及到 copyOnWriteArrayList 时,如果迭代器对象被更新为像下面这样的普通迭代器的删除操作(或)listIterator 被更新(添加/删除),它会抛出 UnsupportedOperationException:
package JavaImpPrograms;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class Wdfds {
public static void main(String[] args) {
List<Integer> list=new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Iterator it=list.iterator();
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
it.remove();
}
System.out.println(list); } }
package JavaImpPrograms;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class Wdfds {
public static void main(String[] args) {
List<Integer> list=new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
ListIterator it=list.listIterator();
while(it.hasNext()){
Integer i= (Integer) it.next();
if(i%2==0)
it.add(9);
}
System.out.println(list); } }
对于上述结果,我有几个问题:
1) 对于一个ArrayList,如果一个迭代器能够在迭代过程中使用迭代器对象修改列表,为什么要用copyOnWriteArrayList呢?
1)为什么copyOnWriteArrayList迭代器更新遇到Iterator对象变化时会抛出unsupportedOperationExceptions,而collection对象发生变化时却没有异常?
3) 上面两个场景好像是对立的,请告诉我这些是什么时候用在什么场景下的?
真是一头雾水……
【问题讨论】:
-
请正确格式化您的代码。
标签: java collections java.util.concurrent listiterator copyonwritearraylist