解决 Java.util.ConcurrentModificationException 异常
问题描述
在迭代集合元素时,如果对集合做 add/remove 操作,会抛出 java.util.ConcurrentModificationException 异常。
原因分析
在集合中,如 ArrayList,对它的做出修改操作(add/remove)时都会对 modCount 这个字段 +1,modCount 可以看作一个版本号,每次集合中的元素被修改后,都会 +1(即使溢出)。最后调用 checkForComodification() 方法来校验 modCount 与 expectedModCount 是否相等,迭代结束后进行 count 对比,不一样就会抛出该异常。
注意:因为 foreach 实现原理是转换为 Iterator.next() 来执行的。既然调用了 Iterator 的 next() 方法,必然需要通过 checkForComodification() 方法来校验 modCount 是否等于 expectedModCount。
解决方案
方法 1
不要通过 list.remove(s) 来移除元素,而是 iter.remove(),这样就没有了。
方法 2
另外准备一个 list 用来保存需要移除的元素,在迭代完毕后一次性移除即可。
以上方法可以有效避免 java.util.ConcurrentModificationException 异常的发生。