Java删除集合中元素的正确姿势

1、使用foreach的话,在删除完元素之后,接着遍历就会抛异常。如下图所示:

 

因为foreach实际的实现原理是迭代器的方式去遍历,会去调用Itr对象的hasNext()和next()方法。在该类的next和remove方法中,都会去调用checkForComodification()方法,该方法内部就做了一件事,判断modCount(实际修改的次数)和expectedModcount(期望修改的次数)是否一致。

因此可以看出,在foreach中去执行list.remove(Object o)方法时,调用到了fastRemove(int index)对list对象的modCount是进行了修改的,但是list对象的迭代器中的exceptedModCount并没有改动,所以此时会抛出ConcurrentModificationException异常

2、使用普通的for循环,不会抛异常,但是接着遍历所得到的数据可能是不正确的,因为在删除元素后,没有修改对应的下标。

因为在list中的remove方法逻辑是将目标元素之后的元素整体向前移动一个位置,然后将最后一个位置置为null,size-1. 

 

3、迭代器的方式:List内部实现了Iterator接口,通过它可以得到一个list的iterator对象。使用该方式可以顺利地删除和遍历集合中的元素,推荐使用。注意这里使用的是迭代器Iterator的remove()方法。在该方法的remove中,每次都会保持modCount和exceptedModCount的一致性。

 

总结:推荐使用迭代器的方式删除元素。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值