先看一段代码:

 @Testpublic void test02(){List<String> list = new ArrayList<>(8);list.add("tom");list.add("jack");list.add("marry");list.add("wuwl");for(String string:list){if("wuwl".equals(string)){list.remove(string);}}}

上面代码在运行过程中,肯定会抛出java.util.ConcurrentModificationException异常的,将list.remove(string);替换成list.add("gg"),也是会抛出同样的异常的。
进入ArrayList源码的909行:

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

使用ArrayListremove方法后,modCount会加一,但expectedModCount在循环开始时,二者是相等的,在通过checkForComodification方法判断后,就会抛出ConcurrentModificationException异常。
而通过ArrayList的内部类Itr里面的remove方法去移除元素时,会将上面的两个属性重新赋值为相等,保证集合的正常操作。
将上面的demo改成下面的代码即可正常运行:

@Test
public void test03(){List<String> list = new ArrayList<>(8);list.add("tom");list.add("jack");list.add("marry");list.add("wuwl");ListIterator<String> iterator = list.listIterator();while(iterator.hasNext()){if("wuwl".equals(iterator.next())){iterator.remove();iterator.add("gg");}}System.out.println(list);
}

ListIterator<String> iterator = list.listIterator();如果换成Iterator<String> iterator = list.iterator();的话,则又有remove方法,没有add方法。list的两个方法在List接口中都有定义,在ArrayList中,iterator()直接返回了Itr(),而listIterator()会返回一个内部类ListItr类型,该类继承了Itr并实现了ListIterator接口。

循环体中对集合进行增删时报错:java.util.ConcurrentModificationException相关推荐

  1. java 循环删除hashmap中的键值对,解决java.util.ConcurrentModificationException报错

    示例 import java.util.HashMap; import java.util.Iterator; import java.util.Map;public class DeleteHash ...

  2. EasyPoi读取word时报错java.util.zip.ZipException: Unexpected record signature: 0X9

    场景:把word模板放入类路径目录下,程序读取word模板,填充数据,导出. 现象:报错java.util.zip.ZipException: Unexpected record signature: ...

  3. 在使用增强for循环的时候对遍历的集合进下remove操作报错java.util.ConcurrentModificationException

    报错: 解决办法: 先在for循环里面使用收集需要删除的元素,然后在集合外统一删 拓展: 为什么? 这是由于增强for循环底层调用的是迭代器的next和hasnext方法来遍历的,移除元素后,无法预知 ...

  4. 循环的时候去删除集合中的元素 java.util.ConcurrentModificationException

    使用for循环,删除集合中的元素,会报错 java.util.ConcurrentModificationException 只能通过迭代器 iterator删除 1:在while循环中使用itera ...

  5. ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决

    ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决 参考文章: (1)ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决 (2)https://ww ...

  6. 在Android Studio中打开Android Device Monitor时报错的解决方法

    在Android Studio中打开Android Device Monitor时报错的解决方法 参考文章: (1)在Android Studio中打开Android Device Monitor时报 ...

  7. 使用torchvision 中的roi_pool/roi_align函数时报错

    使用torchvision 中的roi_pool/roi_align函数时报错 Traceback (most recent call last):File "/home/wkj/cj/ro ...

  8. tensorflow中在使用sess.run时报错

    tensorflow中在使用sess.run时报错TypeError: Fetch argument 6.0811076 has invalid type <class 'numpy.float ...

  9. 使用RestTemplate时报错java.lang.IllegalStateException: No instances available for 127.0.0.1

    我在RestTemplate的配置类里使用了 @LoadBalanced @Component public class RestTemplateConfig { @Bean @LoadBalance ...

最新文章

  1. Android的ADT的安装(离线)
  2. 第四范式再融45亿元:AI领域年度最大手笔,多家券商在列
  3. centos mysql数据迁移_Mysql 5.7.17 离线版安装和数据迁移(centos 7)
  4. 查询ms sql 2005版本号
  5. 【机器学习】K-Means算法的原理流程、代码实现及优缺点
  6. pwn学习总结(四)—— 堆基础知识(持续更新)
  7. 微软发布了开发社区采用.NET Standard的最新信息
  8. react只停留在表层?五大知识点带你梳理进阶知识
  9. 苹果手机免密支付怎么取消_超市“扫码枪”有啥神奇功能?直接扫走你的资金,不用输入密码|移动支付|手机|免密...
  10. 7个等级 容灾等级_猫奴的10个等级 你的奴性有多高?
  11. matlab的数字图像处理,基于MATLAB的数字图像处理分析及应用.pdf
  12. linux远程利用漏洞CVE-2016-4484 93次空密码重试就可以获得root权限 影响大多数Linux版本...
  13. 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验机测试步骤...
  14. 程序员的数学——傅里叶变换
  15. 面试官:策略模式和代理模式有什么区别?
  16. 照片、摄影处理中的基本知识
  17. openGauss数据库源码解析系列文章——openGauss开发快速入门(二)
  18. 百度地图API_BMap接口的使用形式
  19. (转)Asterisk模拟线FXO的主叫号码识别(来电显示)
  20. Windows桌面鼠标右键菜单清理

热门文章

  1. 遍历Java中的列表的方法
  2. 为JavaScript日期添加天数
  3. 怎样阻止电脑开机自动安装大量垃圾软件
  4. 七彩虹智能主板设置U盘启动教程
  5. U 盘无法拷贝大于 4GB 文件的解决方法
  6. (配置消息转换器) sso单点登入之jsonp改进版
  7. Map的使用和遍历方法示例
  8. python urllib下载文件怎么停止_python下载文件的三种方法
  9. passwd: 鉴定令牌操作错误_user 及passwd 设置
  10. 用python直接调用asr技术_python中asr