list中for循环删除多个元素为何报错?

【干货点】 最近review同事代码的时候发现了一个问题,在ArrayList中边遍历边删除多个元素,在提醒同事后就想着写篇文章从源码角度详细聊聊这个问题好了,当然了我也发现很多人其实都不知道这个报错的原理是什么,如果你也不知道,那确实该好好看这篇文章了。

前几天review同事代码的时候发现对方提交了一份list中边遍历边删除的代码,大概是这样的:

初学者咋一看其实没毛病,可是运行结果会是这样的:

哦豁,这是为啥?大家都知道,本饭遇见问题喜欢刨根问底,于是我就在报错的地方断个点,可以看到,在第一次遍历的时候

两个值都是6相等,因此不会抛出ConcurrentModificationException异常。而等到i==2被移除后

可以看到两个值并不一样,因此抛出出ConcurrentModificationException异常终止程序。

本着刨根问底的心态,自然下一步要解决的就是这两个值是什么时候被设置进来以及为什么会不一样呢?

本饭反断点了回去看到在加到第6个值的时候

可以看到此时的modCount为6,到了这一步就解决了ArrayList.this.modCount的设置问题了,接下来看下上文提到的this.expectedModCount问题,我断点for循环后深入调试可以看到

此处在取得遍历器的时候就已经将ArrayList.this.modCount赋值到expectedModCount中,到了这一步就很明显了,在进行remove(i)的时候改变了ArrayList.this.modCount的值,导致两个值不相同,后面还有元素再进行遍历的时候check了一下,发现不对等,所以才翻了车,哦,不对,才报的错。

嗯,终于描述完这个过程了,那么我们再看看,这样子会有问题吗

不会的,哈哈哈,因为在你remove掉数据后,便直接return掉了,不会再进行后续的check,那么自然也就没有问题了。

那么难道就没有方法可以一边遍历一边进行多次删除了吗,不是的,详情等我下篇文章,敬请期待!!!

(o≖◡≖),觉得不错就点分享、在看,支持原创,让其他人知道你有一颗积极向上的????

[好好面试] 系列文推荐:

你必须要懂的Spring-Aop之源码跟踪分析Aop

你必须要懂的Spring-Aop之应用篇

你所不知道的HelloWorld背后的原理

连引用都答不上,凭什么说你是Java服务端开发

你是否了解Spring中bean的生命周期呢?

开发必学,io&nio

你所不知道的HelloWorld背后的原理

如何基于spring动态注册bean

拓展spring组件之自定义标签

基于spring实现事件驱动

Java日常干货

Java&Spring系列笔记

▼更多精彩内容,请长按二维码▼

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值