Java ConcurrentModificationException(同时修改异常)问题原因及解决

1,错误代码

List<String> list = new ArrayList<>();
list.add("dai");
list.add(new String("daa"));
list.add("aaa");
for (String s : list){
    if(s=="dai"||s=="daa"){
        list.remove(s);
    }
}

报错:

原因是:

进入报错信息,AbstractList类,modCount != expectedModCount 抛异常。

modCount :表示对list的修改次数,当调用List的add或者remove方法的时候,这个modCount加一或减一

expectedModCount:Iterator:期望这个list被修改的次数,初始值为modCount。

由于ArrayList是线程不安全的,所以加以上两个参数控制是否同时操作。

arraylist的remove没有将expectedModCount=modCount;导致ArrayListd.next()方法中调用checkForComodification()方法上面两个参数不相等,抛出异常。

解决:

for (String s : list){
    if(s=="di"||s=="da"){
        list.remove(s);
    }
}

替换为

Iterator<String> stringIterator = list.iterator();
while (stringIterator.hasNext()){
    String s = stringIterator.next();
    if(s=="dai"||s=="daa"){
        stringIterator.remove();
    }
}

Iterator重写了remove(),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值