不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁

摘自:
https://www.cnblogs.com/DDiamondd/p/11307825.html

11.【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用
Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。
正例:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator<String> iterator = list.iterator();
	while (iterator.hasNext()) {
	String item = iterator.next();
	if (删除元素的条件) {  
			iterator.remove();
	}
}

反例:

for (String item : list) {
	if ("1".equals(item)) {
		list.remove(item);
	}
}

说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的结果吗?

为什么说上面的例子有些特殊,因为list集合中只有两个数据,如果是只删除第一个数据,执行list.remove(temp)后, cursor=size-1, size=size-1, 所以就会推出循环。没有抛出异常。

将例子改为:

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
for (String temp : list) {
     if("1".equals(temp)){
         list.remove(temp);
   } 
} 

现在有了三个元素,除开直接删除倒数第二个元素不会抛出异常(因为会出现 cursor=size-1, size=size-1的情况,然后退出循环),直接删除其他元素都会抛出ConcurrentModificationException异常!!

如果是下面的写法,更是会抛出异常!

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
for (String temp : list) {
     list.remove(temp);
} 

直接使用iterator的remove/add方法对集合做修改:

List<String> list = new ArrayList<>();      
list.add("1");      
list.add("2");
list.add("3");
list.add("4");
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
   String temp = (String) iterator.next();
   iterator.remove();
}  
``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值