有关迭代器的并发修改异常

Iterator迭代器:
List<String> list = new ArrayList<>();
list.add("老马");
list.add("老王");
list.add("老彭");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
if(iterator.next().equals("老王")){
iterator.remove();//[老马, 老彭]
list.remove("老王");//[老马, 老彭]
//list.add("老王+");//ConcurrentModificationException
}
}
System.out.println(list);
通过List集合添加了元素,而迭代器获取元素时预期的修改值次数和实际的修改值次数不相同造成的
(具体查看ArrayList类中iterator方法中匿名内部类Itr()里的代码实现过程).


ListIterator迭代器:

ListIterator<String> listIterator = list.listIterator();
while(listIterator.hasNext()){
if(listIterator.next().equals("老王")){
//listIterator.remove();//[老马, 老彭]
//listIterator.add("老李");//[老马, 老王, 老李, 老彭]
//listIterator.set("老赵换老王");//[老马, 老赵换老王, 老彭]
//list.remove("老王");//[老马, 老彭]
list.add("浩仔");//ConcurrentModificationException
}
}
System.out.println(list);
通过List集合添加了元素,而迭代器获取元素时预期的修改值次数和实际的修改值次数不相同造成的
(具体是ArrayList类中ListIterator方法中匿名内部内ListItr()继承了他的父类Itr()所以具体情况差不多大同小异)
如果想在ListIterator迭代器中进行删改还不产生并发异常,直接调用ListIterator()本身的方法即可.
 
原文地址:https://www.cnblogs.com/robotsu/p/11486139.html