循环体中对集合进行增删时报错:java.util.ConcurrentModificationException
先看一段代码:
@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();
}
使用ArrayList
的remove
方法后,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相关推荐
- java 循环删除hashmap中的键值对,解决java.util.ConcurrentModificationException报错
示例 import java.util.HashMap; import java.util.Iterator; import java.util.Map;public class DeleteHash ...
- EasyPoi读取word时报错java.util.zip.ZipException: Unexpected record signature: 0X9
场景:把word模板放入类路径目录下,程序读取word模板,填充数据,导出. 现象:报错java.util.zip.ZipException: Unexpected record signature: ...
- 在使用增强for循环的时候对遍历的集合进下remove操作报错java.util.ConcurrentModificationException
报错: 解决办法: 先在for循环里面使用收集需要删除的元素,然后在集合外统一删 拓展: 为什么? 这是由于增强for循环底层调用的是迭代器的next和hasnext方法来遍历的,移除元素后,无法预知 ...
- 循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
使用for循环,删除集合中的元素,会报错 java.util.ConcurrentModificationException 只能通过迭代器 iterator删除 1:在while循环中使用itera ...
- ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决
ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决 参考文章: (1)ECharts问题--柱状图和折线图中xAxis.data为空时报错问题解决 (2)https://ww ...
- 在Android Studio中打开Android Device Monitor时报错的解决方法
在Android Studio中打开Android Device Monitor时报错的解决方法 参考文章: (1)在Android Studio中打开Android Device Monitor时报 ...
- 使用torchvision 中的roi_pool/roi_align函数时报错
使用torchvision 中的roi_pool/roi_align函数时报错 Traceback (most recent call last):File "/home/wkj/cj/ro ...
- tensorflow中在使用sess.run时报错
tensorflow中在使用sess.run时报错TypeError: Fetch argument 6.0811076 has invalid type <class 'numpy.float ...
- 使用RestTemplate时报错java.lang.IllegalStateException: No instances available for 127.0.0.1
我在RestTemplate的配置类里使用了 @LoadBalanced @Component public class RestTemplateConfig { @Bean @LoadBalance ...
最新文章
- Android的ADT的安装(离线)
- 第四范式再融45亿元:AI领域年度最大手笔,多家券商在列
- centos mysql数据迁移_Mysql 5.7.17 离线版安装和数据迁移(centos 7)
- 查询ms sql 2005版本号
- 【机器学习】K-Means算法的原理流程、代码实现及优缺点
- pwn学习总结(四)—— 堆基础知识(持续更新)
- 微软发布了开发社区采用.NET Standard的最新信息
- react只停留在表层?五大知识点带你梳理进阶知识
- 苹果手机免密支付怎么取消_超市“扫码枪”有啥神奇功能?直接扫走你的资金,不用输入密码|移动支付|手机|免密...
- 7个等级 容灾等级_猫奴的10个等级 你的奴性有多高?
- matlab的数字图像处理,基于MATLAB的数字图像处理分析及应用.pdf
- linux远程利用漏洞CVE-2016-4484 93次空密码重试就可以获得root权限 影响大多数Linux版本...
- 混凝土静力受压弹性模量试验计算公式_混凝土静力受压弹性模量试验机测试步骤...
- 程序员的数学——傅里叶变换
- 面试官:策略模式和代理模式有什么区别?
- 照片、摄影处理中的基本知识
- openGauss数据库源码解析系列文章——openGauss开发快速入门(二)
- 百度地图API_BMap接口的使用形式
- (转)Asterisk模拟线FXO的主叫号码识别(来电显示)
- Windows桌面鼠标右键菜单清理