java.util.ConcurrentModificationException异常原因及解决方法

本文深入探讨了Java中ConcurrentModificationException异常的产生原因,分析了ArrayList的ModCount机制,并提供了安全遍历及修改集合的建议。在遍历过程中,直接修改集合会导致异常,而使用迭代器则能避免此问题。通过了解迭代器的工作原理,可以更好地避免这类错误,确保代码的稳定性和安全性。
摘要由CSDN通过智能技术生成

今天项目上报了一些bug,通过查看log发现是ConcurrentModificationException,这个错误之前见过,也知道是遍历list时同时修改了list导致的,但是对其中的原理还不是很清楚,正好借今天的机会学习一下里面的机制。

ArrayList里面有一个变量modCount,专门用来记录该ArrayList被改变了多少次,增删、排序、replace这些改变链表的操作都会导致这个变量自加1

public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, size, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++; //自加1
}

有些操作会定义一个变量,如上面的sort操作,在真正排序数据之前会定义expectedModCount ,然后在排序操作之后再比较两者是否相等,如果不相等就会抛出ConcurrentModificationException。
另外,使用迭代器也会做如上操作,在ArrayList的迭代器中,也有一个expectedModCount 变量,并且在每一次执行next()方法的时候都会检查expectedModCount是否和ModCount相等,因此在使用迭代器遍历的是否,就不能直接使用remove操作了,下面的例子就会报错:

List<Integ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值