java之List集合调用remove方法【陷阱及正确用法】

《阿里巴巴开发手册》

一、通过forEach 调用List.remove() 

 

抛出异常信息: java.util.ConcurrentModificationException    ---》 fast_fail机制

 

查看remove方法源码,并没有和异常相关信息 

 

查看编译后的class文件 :

原来for each的实际上使用的是iterator来遍历循环,其中核心方法是hasNext()和next()

看一下具体的实现: 

这是java集合的 fast-fail机制,借助modCount参数,来记录修改次数,在迭代过程中判断modCount和expectedModCount是都相等,若不相等则会马上抛出 ConcurrentModificationException,在List.remove()中修改了modCount,导致modCount和expetedtModCount不相等,所以抛出异常

二、正确用法

1,iterator.remove(),会对expectedModCount再次赋值

2,下标正向循环 

发现 ”有“没有删除成功,debug看看remove的过程吧

,删除之前,下标和List的数据保持正常

,这时0号下标的数据已经被删除了,删除之后,被删除元素后面的元素都会往前移动,i走到了1,那么”有“这个元素就被跳过了,所以需要手动修正下标的移动。

,此时就能正常删除了

3,通过下标倒序循环删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值