Java 遍历集合时产生的ConcurrentModificationException异常
做JAVA实验的时候用foreach遍历一个ArrayList集合,并且当集合中的某个元素符合某个值时删除这个元素。写完运行时抛出了ConcurrentModificationException异常
当时代码与下方类似,在foreach循环时判断元素的值,当元素的值与2相等时删除
package Test; import java.util.ArrayList; public class Main { public static void main(String[] args) {
ArrayList<Integer> arr = new ArrayList<>();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
for(Integer id : arr){
System.out.println(id);
if( id == 2 ){ //当arr中某个元素的值为2时删除
arr.remove(id);
}
}
19
20 }
21 }
运行结果:
1
2
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at Test.Main.main(Main.java:15)
产生了ConcurrentModificationException异常,网上查了查,foreach本质是调用的collection迭代器的接口,迭代器是依赖于集合存在的,当调用ArrayList的remove()方法时,集合发生了改变,而迭代器并没有重新获取,所以会抛出异常。
解决方法是使用Iterator遍历,并且使用Iterator提供的remove()方法进行元素的删除,代码如下
package Test; import java.util.ArrayList;
import java.util.Iterator; public class Main { public static void main(String[] args) {
ArrayList<Integer> arr = new ArrayList<>();
arr.add(1);
arr.add(2);
arr.add(3);
arr.add(4);
Iterator<Integer> iter = arr.iterator();
while(iter.hasNext()){
Integer i = iter.next();
System.out.println(i);
if( i == 2 ){
iter.remove(); //使用Iterator提供的remove方法
}
}
System.out.println("--------------------");
for(Integer id : arr){ //查看遍历后数组的值
System.out.println(id);
} }
}
运行结果:
1
2
3
4
--------------------
1
3
4
Process finished with exit code 0
值为2的元素成功删除,并且没有报错。
在《阿里巴巴Java开发手册终极版》也有提到这个问题
Java 遍历集合时产生的ConcurrentModificationException异常的更多相关文章
- Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结
首先.这是一个极其简单的问题,大牛可忽略.新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常. 这一个简单的问题再高手严重不值一提,但新手可能会比較困惑,用哪种方式能够安全有 ...
- 在多线程的情况下是由Iterator遍历修改集合对象,报ConcurrentModificationException()异常的根因分析
遍历List时抛ConcurrentModificationException异常原理分析 http://www.blogjava.net/houlinyan/archive/2008/04/ ...
- Lambda 表达式遍历集合时用remove方法删除list集合中满足条件的元素问题
一:循环遍历list集合的四种方式 简单for循环 iterator循环 增加for循环 Lanbda表达式 二:四种遍历方式的用法示例 //简单for循环 List<SalaryAdjustm ...
- Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)
概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList ...
- Java遍历集合的几种方法
遍历集合的几种方法 用不同的方法遍历集合. public interface Iterator:对Collection进行迭代的迭代器.迭代器取代了Java Collections FrameWork ...
- Java 遍历Map时 删除元素
Java代码 package,,,,,,,,,,,==){ System.out.println("delete this: "+key+" = "+key ...
- java遍历Map时remove删除元素
public class T { /** * @param args */ public static void main(String[] args) { // TODO Auto-generate ...
- 【Java】集合(List、Set)遍历、判断、删除元素时的小陷阱
开发中,常有场景:遍历集合,依次判断是否符合条件,如符合条件则删除当前元素. 不知不觉中,有些陷阱,不知你有没有犯. 一.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下 ...
- java中集合部分的笔记
集合类框架概要Collection<E> boolean removeIf(Predicate<? super E> filter)//删除满足条件的元素,如果Collecti ...
随机推荐
- 【u236】火炬
Time Limit: 1 second Memory Limit: 128 MB 2008北京奥运会,你想成为四川汶川的一名火炬手,结果层层选拔,终于到了最后一关,这一关是一道很难的题:任意给定一个 ...
- P1030 队列的基本操作
题目描述 现在给你一个队列,它一开始是空的,你需要模拟队列的操作.队列的操作包括如下: "push x":将元素 x 放入队列中,其中x是一个int范围内的整数: "po ...
- 解决 npm run dev b报错 “'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。”
摘自:https://www.cnblogs.com/laraLee/p/9174383.html 前提: 电脑已经安装了nodeJS和npm, 项目是直接下载的zip包. 在项目目录下运行“npm ...
- vue项目安装scss,以及安装scss报错(this.getResolve is not a function)
1.安装scss: npm install node-sass sass-loader vue-style-loader --save-dev //安装node-sass sass-loader vu ...
- Less 语法快速入门
Less 语法快速入门 Less 是一门 CSS 预处理语言其可以运行在 Node 或浏览器端. 它将传统的 css 样式结构单一的排版顺序进行了优化,让我们可以通过层级嵌套的方式将 css 类名与H ...
- HeidiSQL工具导出导入MySQL数据
有时候,为了数据方便导出导入SQL,我们可以借助一定的工具,方便我们队数据库的移植,可以达到事半功倍的效果.在这里,就给大家简单的介绍一款能方便导出或者导入MySQL的数据. ①首先,选择你要导出的数 ...
- get_free_page 和其友
如果一个模块需要分配大块的内存, 它常常最好是使用一个面向页的技术. 请求整个页也 有其他的优点, 这个在 15 章介绍. 为分配页, 下列函数可用: get_zeroed_page(unsigned ...
- Vue生命周期学习总结
官方文档上关于Vue生命周期的图片大家一定很熟悉: 1.beforeCreate 实例.组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这 ...
- antd Bug记录
antd-mobile Carousel 走马灯竖向滚动内容为空会导致visibility:hidden; Carousel Banner轮播组件初始化加载高度不正确可以在第一张图片onload事件的 ...
- HttpRepl 互操作的 RESTful HTTP 服务调试命令行工具
今天早上曽根セイラ告诉我一个好用的工具 HttpRepl 这是一个可以在命令行里面对 RESTful 的 HTTP 服务进行路由跳转和访问的命令行工具.可以使用 cd 这个命令和像文件跳转已经跳转到下 ...