ArrayList ConcurrentModificationException
1.ConcurrentModificationException
ConcurrentModificationException 出现在使用 ForEach遍历,迭代器遍历的同时,进行删除,增加出现的异常。平常使用的ArrayList, HashMap都有可能抛出这种异常,粗心的话,很容易犯这种错误,导致线上事故!
2. 情景列举
下面就ArrayList的一些使用场景,来讨论是否会抛出ConcurrentModificationException
2.1 For..i 遍历
这个遍历的意思,是指 for(int i = 0 ; i <list.size(); i ++) 这种使用下标进行遍历的方式。
这种情形下,增加都不会有 ConcurrentModificationException。但是也可能导致另外的一些问题,比如下面这段代码,会死循环
(代码手打,可能有错误)
List<Integer> list = new Arraylist<>();
list.add(1);
list.add(2);
list.add(3);
for(int i = 0;i<list.size();i++){
list.add(i);
}
遍历删除的情况下,不会有ConcurrentModificationException,但是要注意代码,防止数组越界异常。下面这种形式的代码会抛出数组越界异常。
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
int length = list.size();
for(int i = 0;i<length;i++){
list.remove(i);
}
当然正常情况下,我们不会先计算 list.size(),而是直接在循环里使用,i<list.size()。这时候可能会导致另外一个问题。看代码
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(1);
list.add(1);
for(int i = o;i<list.size();i++){
if(list.get(i) == 1){
list.remove(i);
//这里加上 i-- 就没有问题了
}
//list.size == 2 也就是说还有两个元素没有删除
}
2.1ForEach 遍历
ForEach 遍历就是 For(Object o : List<Object>) 这种遍历方式,众所周知,ForEach循环只是JAVA的一个语法糖,在字节码层面上,等同于迭代器循环遍历。在这种情形下,增加元素一定会抛出ConcurrentModificationException,
而删除元素在大多数情况下,会抛出ConcurrentModificationException(小知识,当且仅当删除小标为 size()-2,也就是倒数第二个元素的时候,不会抛出异常)。
这种情况下,会有异常抛出
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for (Integer i : list) {
if(i == 1){
list.remove(i);
}
}
可以修改上面的判断语句, i == 1 修改为 i == 2 则不会抛出异常。
3如何避免ConcurrentModificationException
1. 需要遍历新增时,最好new一个和老List相同的临时List,遍历老的List,然后在临时List上进行元素的增加
2. 需要进行删除时,使用迭代器删除(iterator.remove()),而不是直接调用 list.remove()
3.小心,谨慎
ArrayList ConcurrentModificationException的更多相关文章
- 对ArrayList操作时报错java.util.ConcurrentModificationException null
用iterator遍历集合时要注意的地方:不可以对iterator相关的地方做添加或删除操作.否则会报java.util.ConcurrentModificationException 例如如下代码: ...
- ArrayList中的modCount与ConcurrentModificationException
在看ArrayList源码时,看到了一个字段modCount.在add.remove.clear等方法中都有modCount++的操作.不明白什么意思.点进去看了看该字段的解释,总算明白了.modCo ...
- ArrayList的ConcurrentModificationException异常和多线程下的异常
一.ConcurrentModificationException ArrayList源码看为什么出现异常: public class ArrayList<e> extends Abstr ...
- ArrayList中ConcurrentModificationException
java中两种基本的集合结构ArrayList和LinkedList底层有两种不同的存储方式实现,ArrayList为数组实现,属于顺序存储,LinkedList为链表实现,属于链式存储,在对Arra ...
- ArrayList删除--------ConcurrentModificationException问题
在做项目中用到List存储数据,在里面做数据操作时候用到了删除.结果抛出ConcurrentModificationException异常.在这里把问题总结一下. 原因: ArrayList进行for ...
- java.util.ConcurrentModificationException 多线程访问ArrayList引起
http://blog.csdn.net/androiddevelop/article/details/21509345 Java ConcurrentModificationException ...
- ArrayList 并发操作 ConcurrentModificationException 异常
1.故障现象 ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常 2.故障代码 public class ...
- ArrayList迭代修改抛出ConcurrentModificationException
extends:http://www.cnblogs.com/dolphin0520/p/3933551.html Iterator<Integer> iterator = list.it ...
- 计算机程序的思维逻辑 (38) - 剖析ArrayList
从本节开始,我们探讨Java中的容器类,所谓容器,顾名思义就是容纳其他数据的,计算机课程中有一门课叫数据结构,可以粗略对应于Java中的容器类,我们不会介绍所有数据结构的内容,但会介绍Java中的主要 ...
随机推荐
- Hibernate注解-类级别注解
- javascript页面间传递参数
1.通过URL传递参数 传递参数页 function setCity() { var str = document.getElementById("cityName"); if ( ...
- Day3 - Linux系统安装_Centos6.9
第1章 虚拟机安装 1.1 镜像下载 1.1.1 新版本下载 http://mirrors.aliyun.com #阿里云官方镜像站点 1.1.2 旧版本下载 http://vault.cento ...
- 栈的实现Java
package practice; import java.util.Iterator; //栈 public class MyStack<T> implements Iterable&l ...
- flex弹性布局学习
一.介绍 flex( flexible box:弹性布局盒模型),是2009年w3c提出的一种可以简洁.快速弹性布局的属性.主要思想是给予容器控制内部元素高度和宽度的能力.目前已得到以下浏览器支持: ...
- Redis在java中的使用
1.首先安装Redis环境.可以在Windows.linux.别的服务器上搭建Redis环境 2.在java工程中导入必须的jar包 如maven上导入两个jar] <!-- Redis必须包 ...
- Arrays和Collections 对于sort的不同实现原理
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp46 1.Arrays.sort() 该算法是一个经过调优的快速排序,此算法 ...
- poj 2553 强连通
题意:给出一个有向图,定义:若节点v所有能到达的点{wi},都能反过来到达v,那么称节点v是sink.题目要求所有的sink点. 思路:强连通缩点找出出度为零的点,输出即可. 这题主要问题是读题,了解 ...
- React——组件
一.创建组件 在React中有两种创建组件的方式,分别是函数形式的组件和类形式的组件 //函数形式: function Welcome(props){ return <p>this is ...
- NFA的实现
此次发表的是一个不确定的自动机(NFA),它可以根据输入的正规式输出由函数映像表示的结果. 此版本可以输入括号'(',')',但是,实现的过程理解起来有点吃力,所以,在时间允许的情况下,我还将写新文章 ...