项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.ConcurrentModificationException

有如下代码处理ArrayList

    @Testpublic void test1() {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);for(int num: list) {if (num == 2) {list.remove(num);}}System.out.println(StringUtils.join(list, ","));}

代码运行起来会报如下错误:

java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)at java.util.ArrayList$Itr.next(ArrayList.java:859)...

2.分析

https://juejin.im/post/5a992a0d6fb9a028e46e17ef
上面的文章分析得挺详细的,就不复制粘贴了。简单总结一下就是:
ArrayList抛异常的位置源码如下

        final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}

modCount是ArrayList本身的属性,expectedModCount是ArrayList内部类Iterator的属性。
理论上他们是同步的,但是我们在某些操作的过程中导致会导致他们不一致,比如说在这个例子中,我们调用的是ArrayList.remove()方法,修改了size和modCount属性,但是Itr中的这cursor、expectedModCount却没有发生变化,当增强for循环再次执行的时候,调用的却是Itr中的方法,最终发现了数据不一致。这就是本例ConcurrentModificationException产生的根本原因。

3.解决方案

最保险的方案就是在遍历的时候不remove,最后再remove…

    @Testpublic void test2() {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);List<Integer> tmp = new ArrayList<>();for(int num: list) {if (num == 2) {tmp.add(num);}}list.removeAll(tmp);System.out.println(StringUtils.join(list, ","));}

java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification相关推荐

  1. java.util.ConcurrentModificationException at java.util.ArrayList$Itr.next(ArrayList.java:860

    问题 使用ArrayList数据结构, 在迭代的请求页面进行数据刷新, 控制台报错 java.util.ConcurrentModificationExceptionat java.util.Arra ...

  2. FAQ(80):java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification

    2018年8月31日 1.日志: 2018-04-13 20:00:55.757:WARN:oejs.ServletHandler:/g01-web/admin/activityManager/sen ...

  3. 关于java.util.ConcurrentModificationException和remove倒数第二个元素

    2019独角兽企业重金招聘Python工程师标准>>> 首先是两段代码的执行结果: 代码一: public class TestListRemove {public static v ...

  4. 出现 java.util.ConcurrentModificationException 时的解决办法

    for (int i=0; i<list.size(); i++) { // 只有在这种方式遍历集合时,同时对集合增加.删除才不会影响. // list.remove(list.get(i)); ...

  5. java.util.ConcurrentModificationException 解决办法

    在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 则使用会报以下异常: Java.util.ConcurrentModifi ...

  6. java中hashset_Java HashSet – Java中的HashSet

    java中hashset Java HashSet is the most popular implementation of Set interface. java.util.HashSet is ...

  7. 非线程安全类ArrayList出现异常:java.util.ConcurrentModificationException

    今天执行了一段<图解多线程设计模式>中的代码,结果抛出了如下的异常: Exception in thread "ReaderThread" java.util.Conc ...

  8. 循环体中对集合进行增删时报错:java.util.ConcurrentModificationException

    先看一段代码: @Testpublic void test02(){List<String> list = new ArrayList<>(8);list.add(" ...

  9. java.util.ConcurrentModificationException: null异常(已解决,原因出自于Java集合的快速失败机制)

    问题来源 今天我在写项目时,对集合中的元素做了以下操作 报错信息如图 问题来源: 在Java中对集合进行遍历时,一旦对集合进行增删操作,在遍历时会引起java.util.ConcurrentModif ...

最新文章

  1. ICLR2020放榜 687篇入选34篇得满分! 且看OpenReview数据图文详解
  2. Instruments of Xcode
  3. 关于嵌套循环的循环初始化语句问题:
  4. 中国膏剂(膏方)行业运营模式及十四五前景预测报告2022年版
  5. Qt Quick的国际化和本地化
  6. 现代人,特别需要蒸之一
  7. php怎么解析xml,使用PHP快速解析复杂的XML文件
  8. 海洋影音盒 V 2.0
  9. CUDA ---- GPU架构(Fermi、Kepler)
  10. 使用JavaScript创建Table时,用cellSpacing而不是cellspacing
  11. Please create pull requests instead of asking for help on Homebrew‘s GitHubError: macOS 10.13
  12. windows 程序员计算器
  13. 谷歌浏览器连接超时_技术丨常见在线课堂网络连接网络视频播放的解决方案...
  14. 计算机程序员带什么手表,程序员只爱格子衫?这些手表程序员也喜欢!
  15. 猜一宋词名句 Java_宋词名句
  16. 计算机ram rom,ROM和RAM区别是什么?
  17. Android开发新手入门总结(1)
  18. java双层list扁平化,浅谈java8 stream flatMap流的扁平化操作
  19. 1315: 小鱼比可爱
  20. 戴尔Precision工作站 为元宇宙打造稳定高效创作基石

热门文章

  1. Lightroom Classic 12.0下载安装教程LRc12.0一键下载安装
  2. 学习笔记(2):SpringBoot实战教程:SpringBoot企业级线上商城项目讲解-前端技术选型介绍1
  3. 构造函数原型prototype
  4. 推荐4款不足1M的冷门工具
  5. 优思学院|简单而强大的5W1H提问法
  6. 基于PHP化妆品销售网上商城网站
  7. 浪潮服务器修改ipmi账号密码,通过ipmitool批量修改服务器ipmi的syslog目标服务器IP地址与端口号...
  8. python编写程序、输出公元2000年到3000年所有闰年_编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10个年号换一行.判断公元年是否为闰年的条件...
  9. rocketmq python 某个队列不消费_消息队列 RocketMQ 版消息轨迹没有显示消费信息,为什么?...
  10. Connectify是一款很实用的免费软件。能把计算机变成一个无线路由器