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中的主要 ...
随机推荐
- struts2快速入门
1. 下载开发包 课程 以 struts2 3.15.1 讲解 2. 目录结构 apps : struts2官方demo docs : 文档 lib : jar包 src : 源码 3. 导入jar包 ...
- login shell与non-login shell的区别
Bash应该是我们每天日常工作接触最多的东西了,就像我们最忠实的朋友,我们有必要了解一下这位朋友的“习性”. Bash有几种不同的运行模式,login shell与non-login shell,in ...
- grep Pocket Reference读记
1 简介 grep的基本命令格式如下: grep [options] [regexp] [filename] 如果regexp中含有空格,应该使用单引号或双引号括起来.单引号和 ...
- JavaScript--我发现!原来你是这样的JS(1)
一.前言: 前段时间看红宝书(JavaScript高级程序设计),但没有计划的去看,也没有做详细的笔记,读了之后有点空虚,感觉不对劲啊,学的东西很难记住,印象不深啊,有种挫败感,作前端的js都学不好怎 ...
- java值传递与引用传递实例
public class Test2 { public static void main(String[] args) { int[] arr=new int[5]; arr[0]=10; arr[1 ...
- chrome开发工具指南(五)
Main Menu Click More to open the Main Menu. Settings To open Settings, do one of the following: Pre ...
- java开发网易电话面试 一面总结
晚上八点多自己在看视频的时候突然接到杭州来的一个电话,当时觉得很奇怪,突兀,接通之后被告知是杭州网易打来的,没有简单的自我介绍,没有多余的废话,直接入主题,吓得我心里怪紧张的,完全没有准备,但是也没有 ...
- java 实现微博,QQ联合登录
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt313 开发平台 http://connect.qq.com/ http:/ ...
- mysql添加外键约束变为索引
今天有位自己填上一坑:mysql储存引擎 原因就是数据库表引擎为:MyISAM,建立主外键关系需要是InnoDB: 解决方案:alter table table_name1 engine=inno ...
- python tornado 实现类禅道系统
最近楼主加班 喽, 好久没有更新我的博客了,哎,一言难尽,废话我就不说了,来开始上精华. 背景:目前市面上有很多bug管理工具,但是各有各的特点,最著名,最流行的就是禅道,一个偶然的机会接触到了pyt ...