竹笋

首页 » 问答 » 灌水 » 执行ArrayList的removeo
TUhjnbcbe - 2025/7/21 17:43:00

简介

或许有很多小伙伴都尝试过如下的代码:

然后会发现抛出java.util.ConcurrentModificationException异常,这是一个并发异常。那么这个到底是什么情况?首先需要介绍一下增强for循环

增强for循环

增强for循环是Java1.5后,Collection实现了Iterator接口后出现的。增强for循环的代码如下

其实增强for循环就是使用Iterator迭代器进行迭代的,增强for循环就变成下面这样:

那么为什么在增强for循环中调用list.remove(object)会出事呢?那么咱们看看ArrayList下的Iterator的实现类:Itr类

Itr子类

Itr子类是Iterator的实现类,属于ArrayList私有的局部内部类。我截取了Itr类的部分代码,如下:

elementData是ArrayList存放元素的数组,上面代码没有贴出来。size是elementData实际存放的容量大小modCount记录elementData容量的修改次数expectedModCount记录实例化迭代器Itr时,elementData容量的修改次数注意!:在迭代器中,当执行next方法的时候,会去调用checkForComodification方法,判断elementData的容量是否被修改过。

然后来看看ArrayList的remove(object)方法,截取部分代码如下:

可以发现,调用remove(object)方法时调用了fastRemove方法,在fastRemove方法中执行modCount++!现在把文章开头的代码拷下来,再来分析一次:

当执行了list.remove时,执行modCount++。此时迭代器再往下进行迭代,执行了next方法,发现modCount!=expectedModCount,那么则抛出java.util.ConcurrentModificationException异常。之所以Iterator认为是一个并发异常。是因为你不在迭代器里操作,而是在迭代器外面进行remove操作呀!

难道没有其他解决方案吗?有滴。

解决方案

那么就是使用Itr的remove方法。Itr子类重写了remove方法,这里部分代码:

其实很简单,就是remove后,把expectedModCount同步一下modCount的值,这就解决了。完整代码如下:

总结

本来我还不知道增强for循环是调用Iterator进行迭代的,要不是我debug了一波,我还不知道呐。还是小有收获。

1
查看完整版本: 执行ArrayList的removeo