解决 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
异常的发生。