遍历ArrayList可以有for循环、foreach、迭代器iterator、listIterator,其中通过foreach来遍历同时修改 ArrayList时会抛出 ConcurrentModificationException异常。A博客和B博客都对这个问题进行了分析。

A博客中这句话(上图)的意思是:arraylist2调用remove方法(这个方法不是迭代器的删除方法,是ArrayList类自己的)删除元素后,modCount变量加一,但是foreach底层的迭代器中的expectedModCount变量并没有得到更新,因为expectedModCount只在刚进入foreach时,创建对应迭代器时才有更新(对应代码截图的红框1),这就导致foreach底层通过next方法遍历时,modCount和expectedModCount不相等,导致checkForComodification()方法抛出异常(红框2,4)。

ArrayList显式调用iterator()方法生成对应迭代器iterator时,我们可以通过迭代器的remove方法删除刚刚访问过的元素(如下图),能够这样做是因为在remove方法内我们对expectedModCount进行了更新,保证了modCount和expectedModCount相等(上图红框3)。因为ArrayList类中的私有迭代器类Itr没有实现add方法,所以自然就不能通过迭代器来添加元素了。这里也说明只要是我们通过ArrayList类的方法操作过,修改了modCount,但是没有更新expectedModCount,那就会报错。但修改Itr类中expectedModCount的地方就两个,大家盯紧这两个地方就行了。

listIterator迭代器大家可以去看源代码,ListIterator类保证了modCount和expectedModCount相等,不会出现不相等情况,通过listIterator来进行添加和删除元素都是安全的。

通过foreach遍历ArrayList时同时修改报错分析相关推荐

  1. foreach遍历ArrayList时的不当操作与解决

    1.不当操作1:ConcurrentModificationException并发修改异常 代码: public class TestList {public static void main(Str ...

  2. foreach迭代ArrayList时,真的不能删除元素吗?

    ArrayList是java开发时非常常用的类,常碰到需要对ArrayList循环删除元素的情况.这时候大家都不会使用foreach循环的方式来遍历List,因为它会抛java.util.Concur ...

  3. 写一段代码在遍历 ArrayList 时移除一个元素?

    今天楼主继续分享一道经典Java面试题并进行相关知识点的拓展: 上题: 写一段代码在遍历 ArrayList 时移除一个元素? 该问题的关键在于面试者使用的是 ArrayList 的 remove() ...

  4. 遍历ArrayList时移除重复元素失效问题

    遍历ArrayList时移除重复元素失效问题 在使用ArrayList时遇到个问题,例如: public static void remove(ArrayList<String> list ...

  5. 12 c for. oracle rac,【案例】Oracle RAC FOR AIX搭建执行root.sh时两次报错的解决办法

    天萃荷净 运维DBA反映在aix 5.3 ml6安装10.2.0.1 rac报错0509-036 Cannot load program crsctl.bin because of the follo ...

  6. java使用cmd编译中文时错误,解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题...

    解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 在刚开始学习Java的过程中,考虑到记事本应用没 ...

  7. 使用LATTICE的XO3器件进行调试时,reveal报错“Falied to link signal”怎么解决?

    向博主本人提问FPGA相关问题 具体错误信息如下: Failed to link segnal '-': trace promoted but not in database '-' Core Lin ...

  8. 在使用macbook合并Excel表格时,系统报错。(XLRDError)

    Python 学习日志 设备:MacBook Air 开发环境:Jupyter 问题:关于合并Excel表格时报错的问题. Trouble: 在使用macbook合并Excel表格时,系统报错.系统显 ...

  9. 关于webpack打包时less-loder安装报错处理

    关于webpack打包时less-loder安装报错 loadercontext.getresolve is not a function 需要换低版本的less-loader 在package.js ...

最新文章

  1. Unity3D是怎么提升游戏运行效率的?
  2. 简单介绍python连接telnet和ssh的两种方式
  3. FSWD_3_JavaScriptAdvance
  4. 车牌识别--Towards End-to-End License Plate Detection and Recognition: A Large Dataset and Baseline
  5. Qt中事件循环机制详解
  6. mongodb如何实现更新一个字段的值为另外一个字段的值?
  7. java 8 list,JAVA8 ListListInteger list中再装一个list转成一个list操作
  8. xp sp3 安装不了ie8
  9. resnet结构_ResNet 残差网络论文阅读及示例代码
  10. php 重定向 post,使用Jquery post时PHP不会重定向
  11. 【已解决】onenote无法正常打印怎么办?
  12. 分享17个老罗Android开发视频教程(免费下载)
  13. 杨强教授新番!破解机器学习数据孤岛和数据保护难题
  14. python做var模型_python中VAR模型的条件预测
  15. 深度学习项目实施流程
  16. C++读写操作ofstream(数据丢失问题)
  17. 苹果充电显示不支持此配件_水果手机充电时,显示不支持此配件时的应急处理小窍门...
  18. 采集规则:小说网站 www.hexaworld.net适用于易读系统的采集规则
  19. The Tao Of Programming —— 编程之道
  20. 企业邮箱一般从哪登录?

热门文章

  1. 收缩表段(shrink space)
  2. 逆向工程第007篇:扫雷辅助的研究——0秒实现一键自动扫雷
  3. C++程序卡死、UI界面卡顿问题的原因分析与总结
  4. 软考项目管理师(高级)快速通过分享
  5. 在大厂做程序员有多爽?
  6. android隐藏toolbar,Android CoordinatorLayout的使用——实现Toolbar的隐藏和折叠
  7. Gitlab.com 误删300G数据,备份失效后直播抢救过程
  8. matlab点运算与不加点,MATLAB中的点运算与常规运算符规则
  9. html鼠标滑轮不显示滚动条,《html》不显示滚动条,鼠标滑轮可以控制向下滚动是什么原因?...
  10. HTML写一个简单的登录注册界面