当我们用集合迭代器遍历列表时,不注意的话,就集合进行修改(增删改),就会产生ConcurrentModificationException 的报错,即并发修改异常,如下列代码:
这个异常产生的原因是,迭代器依赖于集合而存在,在判断成功后,集合中添加了新的元素,而迭代器并不知道,所有就报错了。其实这个问题说的是:迭代器遍历集合中的元素的时候,不要使用集合对象去修改集合中的元素。
翻看ArrayList源码和iterator()方法的具体实现,可以发现ArrayList继承于集合抽象类有一个成员变量modCount,在每次对元素进行增删改时,相应方法会将modCount++。而进行遍历iterator的next方法中首先会调用checkForComodification()方法,这个方法会对modCount和expectedModCount进行比较,expectedModCount是iterator的成员变量,一开始被赋值为modCount,两者不等就会抛出并发修改的异常。
解决方案:迭代器遍历的时候,可以通过迭代器修改集合中的元素,iterator类中也有修改元素的方法,并在修改完成后重新将modCount赋值给expectedModCount,之后进行next遍历检查就不会再报异常。
或者,我们可以在集合遍历的时候,通过集合对象修改集合中的元素,这样也不会进行期望修改次数与实际修改次数的比较,因此不会抛出异常。