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

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

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

List list = new ArrayList<>();
list.add("1");
list.add("2");
Iterator 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 list = new ArrayList();
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 list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
for (String temp : list) {
     list.remove(temp);
} 

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

List 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();
}  
``

你可能感兴趣的:(不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁)