增强for循环在移除元素时ConcurrentModificationException

时间:2022-09-21 09:52:09
  • 在使用增强for循环时,在循环体内移除一个集合元素后,出现concurrentModificationException异常的解决办法
List<String> list = new ArrayList<String>();
list.add("h");
list.add("y");
list.add("q");

for(String s : list){
System.out.println("外部:"+list.size());
if("q".equals(s)){
list.remove(s);
}
}
}
错误:
Exception in thread "main" java.util.ConcurrentModificationException
at ...

这是由于增强for循环底层调用的是迭代器的next和hasnext方法来遍历的,移除元素后,无法预知到元素的位置。这也是增强for的缺点,不能获取下标,不能动态删除集合中的内容。

  • 解决的办法如下:
List<String> list = new ArrayList<String>();
list.add("h");
list.add("y");
list.add("q");

List<String> list_remove = new ArrayList<String>();
for(String s : list){
if("q".equals(s)){
list_remove.add(s); //把要移除的统一放在一个集合
}
}
//统一移除
list.removeAll(list_remove);
System.out.println(list);//[h, y]