今天在做实验2的过程中,在删除ArrayList中的指定元素时遇到了问题,从一个图的边集中删除指定的边时出现了异常。为了表述方便,下文使用一段情况类似的代码进行演示。
如图,是一个存放字符串的ArrayList,存放了四个字符串,其中“a”重复两次
此时从其中删除全部的“a”,采用for-each循环,会产生如下异常:
异常出现的位置在 java.util.ArrayList类的内部类Itr中的checkForComodification方法中。
如果modCount和expectedModCount不相等,就会抛出该异常。通过查阅资料可以得知modCount是修改记录数,expectedModCount是期望修改记录数,初始化时expectedModCount=modCount。ArrayList集合的remove操作对modCount++操作,就会导致expectedModCount和modCount值不相等从而产生ConcurrentModificationException异常。
要解决该问题,可以采取如下的方法:
1.根据编译器的提示,将for-each循环改为如下的Collection.removeIf方法:
修改后的方法如图,已经不存在异常抛出现象:
2.还可以使用迭代器遍历ArrayList,并使用迭代器的方法删除元素:
这样异常也不会再抛出了
3.除此之外,也可以采用普通的for循环来代替for-each循环,具体如图所示:
但值得注意的是,每次找到一个删除目标元素后,对s使用remove方法都会导致原本在该元素之后的所有元素的索引值减1,如果直接按照下一个索引值继续遍历,会导致跳过一个元素,因此在删除一个元素后应该让索引值减1后再继续遍历。