如何避免 ConcurrentModificationException 异常

在实际生产过程中,碰到了一个概念中的异常,ConcurrentModificationException
这个异常主要出现在集合的遍历中,对集合进行了add或者remove的操作;
以ArrayList为例子,当在forEach的时候,对list本身进行add或者remove的操作,查看ArrayList的源码,相当于是移动了指针;点击查看
以HashMap为例,集合的修改有一个modCount,遍历的时候底层代码会去校验这个modCount,如果在遍历的过程中集合进行了修改操作,那么这个modCount就和初始的不一致,抛出ConcurrentModificationException异常;点击查看这里也关系到了一个概念—集合的快速失败 fail-fast机制

那么如何避免呢?
方法一: 通过集合的普通遍历方式(并非forEach方式,因为foreach本身也是一种迭代)

for(i=0;i<size();i++)

方法二: 通过迭代器进行迭代删除:

List<String> listStr = new ArrayList();
listStr.add("aaacc");
listStr.add("bbbcc");
Iterator<String> lista = listStr .iterator();
        while (lista .hasNext()){
            String t = lista .next();
            if (t.length() == 3) {
                lista .remove();
                continue;
            }
        }

这里引申一下“如何跳出本次循环进行下一次 和 如何跳出整个循环体”?
continue break return;

  1. continue: 跳出本次循环,直接进行下一次循环;
  2. break 是结束整个循环过程;不再进行下一个判断是不是符合条件;“中断退出当前循环”
  3. return return 和循环没关系,就是跳出当前函数,不用再循环中;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值