java.util.ConcurrentModificationException 并发修改异常

如果有不对的地方请大家指出来哈

 

现在我们有一个需求:

需求如果li集合中有'0',则再add一个元素'x'

 

        List<String> li = new ArrayList<String>();
        li.add("111");
        li.add("222");
        li.add("0");
        li.add("333");
        Iterator<String> it = li.iterator();

        while (it.hasNext()){
            if(it.next().equals("0")){
               li.add("X");
            }
        }

我们看这段代码的逻辑并没有错

但是执行时却会抛出ConcurrentModificationException 并发修改异常,,这是为什么呢

我们根据异常找到相应的方法、Itr.next()

我们查看Array List源码的时候发现iterator()方法返回了一个内部类

这个内部类重写了next()   remove()方法,现在我们主要看出了错误的next()方法和里面的checkForComodification()方法

 

我们找到这个方法后发现他是这样写的,这个modCount 和expectedModCount是啥意思呢

modCount :实际修改的次数

expectedModCount:预计修改的次数

这个两个数在内部类 Itr 中是相等的而且,初始值为0(这个在 AbstractList中有写到)

此时我们想到我们用了add方法我们发现在add方法中modCount被增加了expectedModCount没有增加,此时就抛出了java.util.ConcurrentModificationException 并发修改异常

我们怎末解决呢,我们可以用li的get(i)来解决,因为get(index i)没有对modCount的值进行改变

for(int i=0;i<li.size();i++){
    if(li.get(i).equals("0")){
        li.add("x");
    }
    System.out.println(li.get(i));
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值