摘自:
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();
}
``