arraylist remove() java_执行ArrayList的remove(object)方法抛异常?
简介
或许有很多小伙伴都尝试过如下的代码:
然后会发现抛出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了一波,我还不知道呐。还是小有收获。
arraylist remove() java_执行ArrayList的remove(object)方法抛异常?相关推荐
- Java 集合中遍历删除元素抛异常的原因,从ArrayList说起
文章目录 使用for删除遗漏元素的原因: 使用foreach删除报错的原因: 其它集合的删除方法 删除集合元素的工具类 ArrayList删除元素的方式. 使用for循环删除.会遗漏删除的元素 使用f ...
- java arraylist 源代码_java中ArrayList的源代码是什么
展开全部 package java.util; public class ArrayList extends AbstractList implements List, RandomAccess, C ...
- Lession11 集合和泛型(ArrayList方法、Arraylist类、ArrayList添加对象、ArrayList长度、HashTable类、Hashtable类练习-----)
目录 ArrayList方法: ArrayList添加对象: Arraylist类: ArrayList长度: HashTable类: Hashtable类练习: IComparable泛型接口排序: ...
- Java的ArrayList集合_JAVA之ArrayList集合
/** * ArrayList集合讲解 * 集合的添加.遍历.删除 */ package com.test; import java.util.*; public class test7 { /** ...
- arraylist java 排序_「arraylist排序」java ArrayList的两种排序方法 - seo实验室
arraylist排序 1.ArrayList使用排序的初衷 我们知道ArrayList的好处是可以不用限定容器的大小,他会根据元素的增加自己扩大.但是存储进去的数据类型都会变成object,虽然每个 ...
- ArrayList clone()– ArrayList深拷贝和浅拷贝
示例程序以ArrayList克隆方法为例. 学生对象上的ArrayList深层复制和浅层复制示例. 1.简介 ArrayList clone()– ArrayList深复制和浅复制 . ArrayLi ...
- Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())
一般想知道List 与ArrayList 的区别可能大部分都是看到了 List list = new ArrayList(); 和 ArrayList arrayList = new ArrayLis ...
- STL的remove函数和list的remove成员函数
今天看书刚刚看的,就记录下来吧.这可能是老生常谈了,权且作为一个警醒的例子吧. 大家都知道STL有两个非常重要的组成部分,容器和算法. 算法就是一个个的函数,通过迭代器和容器关联在一起,完成一些工作. ...
- java arraylist 函数_Java Extend ArrayList函数
让我说我有 class Dummy { String a, b; public Dummy(String a, String b) { this.a = a; this.b = b; } public ...
最新文章
- 红牛开发板模拟器简要说明_V1.0
- 高性能网站建设的14个原则
- 后台开发经典书籍--Linux多线程服务端编程:使用muduo C++网络库
- 北斗词卡(二):这些关于北斗的缩略词术语,你认识吗?
- MAC查找JDK的路径
- pandas绘图_Pandas内置绘图方法(线型图、柱状图、密度图)
- Python爬虫时中文乱码的处理
- Python基于协同过滤算法的电影推荐系统设计与实现
- qemu-nbd挂载虚拟机镜像文件系统
- android消息提示框大小,android Toast設置彈框大小
- 【文献阅读】ERNIE: Enhanced Representation through Knowledge Integration
- java多线程并发基础汇总一
- 场景文字识别论文阅读
- Win10 WSL2 linux 子系统安装Docker
- python股票分析之放量跌倒底买入
- Android头像上传实战模拟
- 获取安卓app的package和activity比较好用的方式
- 充电桩和换电站哪个前景更好
- 小米集团2020全球校园招聘正式开启!
- 用友U8.0 V10虚拟机安装教VBox + Vmware