阿里规范中指出不允许foreach循环中对集合元素做add/remove操作,不然会报并发修改异常 ConcurrentModificationException导致快速失败fail-fast。
增强for循环是一种简化迭代集合元素的方式。这种循环结构的设计初衷是为了方便遍历集合中的元素,而不是用于修改集合本身。因此,增强for循环不允许在循环体内直接添加或删除元素
查看class文件 底层就是迭代器。
删除报错
总结
简而言之,ConcurrentModificationException
异常之所以会在使用增强for循环时抛出,是因为增强for循环内部实际上使用了一个迭代器(Iterator
)来遍历集合。在遍历过程中,如果尝试使用集合自身的add
或remove
方法来添加或删除元素,而不是使用迭代器提供的add
或remove
方法,就会导致迭代器无法正确跟踪集合的修改。当迭代器发现集合在其不知情的情况下被修改时,为了维护遍历的一致性和准确性,它会抛出ConcurrentModificationException
异常,以提醒开发者存在潜在的并发修改问题。为了避免这种异常,当需要在遍历过程中修改集合时,应该使用迭代器提供的remove
方法,或者考虑使用其他适当的循环结构。
解决方案
-
使用Collection.removeIf()方法,底层是通过迭代器删除,移除满足指定条件的元素
-
使用Java 8中提供的filter过滤
-
使用普通for;普通for循环并没有用到Iterator的遍历,所以压根就没有进行fail-fast的检验
-
使用Iterator来删除;
-
使用增强for仅删除一个元素;删除后立刻跳出循环不会触发快速失败机制。