阿里规范中指出不允许foreach循环中对集合元素做add/remove操作原因分析和解决方案。

阿里规范中指出不允许foreach循环中对集合元素做add/remove操作,不然会报并发修改异常 ConcurrentModificationException导致快速失败fail-fast。

增强for循环是一种简化迭代集合元素的方式。这种循环结构的设计初衷是为了方便遍历集合中的元素,而不是用于修改集合本身。因此,增强for循环不允许在循环体内直接添加或删除元素

查看class文件 底层就是迭代器。

删除报错

总结

简而言之,ConcurrentModificationException异常之所以会在使用增强for循环时抛出,是因为增强for循环内部实际上使用了一个迭代器(Iterator)来遍历集合。在遍历过程中,如果尝试使用集合自身的addremove方法来添加或删除元素,而不是使用迭代器提供的addremove方法,就会导致迭代器无法正确跟踪集合的修改。当迭代器发现集合在其不知情的情况下被修改时,为了维护遍历的一致性和准确性,它会抛出ConcurrentModificationException异常,以提醒开发者存在潜在的并发修改问题。为了避免这种异常,当需要在遍历过程中修改集合时,应该使用迭代器提供的remove方法,或者考虑使用其他适当的循环结构。

解决方案

  • 使用Collection.removeIf()方法,底层是通过迭代器删除,移除满足指定条件的元素

  • 使用Java 8中提供的filter过滤

  • 使用普通for;普通for循环并没有用到Iterator的遍历,所以压根就没有进行fail-fast的检验

  • 使用Iterator来删除;

  • 使用增强for仅删除一个元素;删除后立刻跳出循环不会触发快速失败机制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值