考虑一个 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); } }
更新迭代器对象时不是这种情况,即如下所示:
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)看起来上面2个场景是相反的。请告诉我这些什么时候使用以及在哪些场景中使用?
这完全令人困惑......