删除json中的一个元素_ArrayList中for循环删除多个元素为何报错?

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

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

d517b890d9e331268686f934469eeaa4.png

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

c357ed23de61f3d67e9a52e2bcf56155.png

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

1c48f6549b22a92e4434935ac6252208.png

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

a74770428b7bdc85c0b3085f3cb37ad4.png

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

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

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

99c9e4acb211066a4149433e29ff029e.png

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

71e67ce9d4945979ff2d72f3721d80ab.png

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

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

5a7b29f800fbdaf807c49b01fd312ad3.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值