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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值