简介

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

然后会发现抛出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)方法抛异常?相关推荐

  1. Java 集合中遍历删除元素抛异常的原因,从ArrayList说起

    文章目录 使用for删除遗漏元素的原因: 使用foreach删除报错的原因: 其它集合的删除方法 删除集合元素的工具类 ArrayList删除元素的方式. 使用for循环删除.会遗漏删除的元素 使用f ...

  2. java arraylist 源代码_java中ArrayList的源代码是什么

    展开全部 package java.util; public class ArrayList extends AbstractList implements List, RandomAccess, C ...

  3. Lession11 集合和泛型(ArrayList方法、Arraylist类、ArrayList添加对象、ArrayList长度、HashTable类、Hashtable类练习-----)

    目录 ArrayList方法: ArrayList添加对象: Arraylist类: ArrayList长度: HashTable类: Hashtable类练习: IComparable泛型接口排序: ...

  4. Java的ArrayList集合_JAVA之ArrayList集合

    /** * ArrayList集合讲解 * 集合的添加.遍历.删除 */ package com.test; import java.util.*; public class test7 { /** ...

  5. arraylist java 排序_「arraylist排序」java ArrayList的两种排序方法 - seo实验室

    arraylist排序 1.ArrayList使用排序的初衷 我们知道ArrayList的好处是可以不用限定容器的大小,他会根据元素的增加自己扩大.但是存储进去的数据类型都会变成object,虽然每个 ...

  6. ArrayList clone()– ArrayList深拷贝和浅拷贝

    示例程序以ArrayList克隆方法为例. 学生对象上的ArrayList深层复制和浅层复制示例. 1.简介 ArrayList clone()– ArrayList深复制和浅复制 . ArrayLi ...

  7. Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())

    一般想知道List 与ArrayList 的区别可能大部分都是看到了 List list = new ArrayList(); 和 ArrayList arrayList = new ArrayLis ...

  8. STL的remove函数和list的remove成员函数

    今天看书刚刚看的,就记录下来吧.这可能是老生常谈了,权且作为一个警醒的例子吧. 大家都知道STL有两个非常重要的组成部分,容器和算法. 算法就是一个个的函数,通过迭代器和容器关联在一起,完成一些工作. ...

  9. java arraylist 函数_Java Extend ArrayList函数

    让我说我有 class Dummy { String a, b; public Dummy(String a, String b) { this.a = a; this.b = b; } public ...

最新文章

  1. 红牛开发板模拟器简要说明_V1.0
  2. 高性能网站建设的14个原则
  3. 后台开发经典书籍--Linux多线程服务端编程:使用muduo C++网络库
  4. 北斗词卡(二):这些关于北斗的缩略词术语,你认识吗?
  5. MAC查找JDK的路径
  6. pandas绘图_Pandas内置绘图方法(线型图、柱状图、密度图)
  7. Python爬虫时中文乱码的处理
  8. Python基于协同过滤算法的电影推荐系统设计与实现
  9. qemu-nbd挂载虚拟机镜像文件系统
  10. android消息提示框大小,android Toast設置彈框大小
  11. 【文献阅读】ERNIE: Enhanced Representation through Knowledge Integration
  12. java多线程并发基础汇总一
  13. 场景文字识别论文阅读
  14. Win10 WSL2 linux 子系统安装Docker
  15. python股票分析之放量跌倒底买入
  16. Android头像上传实战模拟
  17. 获取安卓app的package和activity比较好用的方式
  18. 充电桩和换电站哪个前景更好
  19. 小米集团2020全球校园招聘正式开启!
  20. 用友U8.0 V10虚拟机安装教VBox + Vmware

热门文章

  1. 使网页成黑白色调的滤镜(转)
  2. ListObject 多条件去重
  3. 洛谷 1341 无序字母对
  4. 程序猿的日常——JVM内存模型与垃圾回收
  5. 第二次冲刺每日站立会议03
  6. 30款顶级CSS工具及应用-CSDN.NET
  7. Javascript里使用Dom操作Xml
  8. 【操作系统复习】系统调用
  9. Snipaste的安装及快捷键的设置
  10. python自己创建模块路径_python之本地模块/包使用和创建