ArrayList移除指定元素的问题

今天在做实验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后再继续遍历。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值