java.util.ConcurrentModificationException详解
引用于http://blog.csdn.net/dabing69221/article/details/40065071
在使用set/map时,一个可爱的小bug:Java.util.ConcurrentModificationException
【错误场景1】:set容器,边遍历,边add/remove元素
Set<String> set = new HashSet<String>();for (int i = 0; i < 10000; i++) {set.add(Integer.toString(i));}for (String str : set) { //或使用iterator来循环,JDK5.0以上,这样的遍历底层也都是iterator实现。set.add("xxx"); //报错// set.remove(str); //报错}
【错误场景2】:map容器,边遍历,边remove元素
Map<String, String> map = new HashMap<String, String>();for (int i = 0; i < 100; i++) {map.put(Integer.toString(i), Integer.toString(i));}for (String str : map.keySet()) {//或使用iterator来循环map.remove(str); //报错}
【错误场景3】list容器,边遍历,边add/remove元素
List<String> list = new ArrayList<String>();for (int i = 0; i < 100; i++) {list.add(Integer.toString(i));}for (Iterator<String> it = list.iterator(); it.hasNext();) {String val = it.next();if (val.equals("5")) {list.add(val); //报错// list.remove(val); //报错}}
【错误原因】
- 对于remove操作,list.remove(o)的时候,只将modCount++,而expectedCount值未变,那么迭代器在取下一个元素的时候,发现该二值不等,则抛ConcurrentModificationException异常。
- 对于add操作,同remove
【解决办法】
- remove:用iterator提供的原生态remove()
add:同remove就错了,iterator没有提供原生的add()方法。真是的,还要用新的容器暂存,然后再遍历结束后,全部添加到原容器当中。
set/list:这两类常用容器,就用上面说的方法remove(), add()就好了。
map:直接使用ConcurrentHashMap就ok。为什么别的容器,不也实现个concurrent版本直接用。。?库里不搞,自己搞。
【正确使用案例】
for (Iterator<String> it = list.iterator(); it.hasNext();) {String val = it.next();if (val.equals("5")) {it.remove();}}
List<String> newList = new ArrayList<String>();for (Iterator<String> it = list.iterator(); it.hasNext();) {String val = it.next();if (val.equals("5")) {newList.add(val);}}list.addAll(newList);
java.util.ConcurrentModificationException详解的更多相关文章
- java并发包java.util.concurrent详解
线程池ThreadPoolExecutor的使用 并发容器之CopyOnWriteArrayList 并发容器之CopyOnWriteArraySet 数据结构之ConcurrentHashMap,区 ...
- java.util包详解
介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结 ...
- Java.util.ArrayList详解
java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...
- [转载] java多线程学习-java.util.concurrent详解(一) Latch/Barrier
转载自http://janeky.iteye.com/blog/769965 Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent, 提供了大量高级工具,可 ...
- [转载] java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
转载自http://janeky.iteye.com/blog/770393 ------------------------------------------------------------- ...
- [转载] java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor
转载自http://janeky.iteye.com/blog/770441 ------------------------------------------------------------- ...
- [转载] java多线程学习-java.util.concurrent详解(四) BlockingQueue
转载自http://janeky.iteye.com/blog/770671 ------------------------------------------------------------- ...
- java.util.ConcurrentModificationException 异常问题详解
环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常, ...
- java.util.ConcurrentModificationException解决详解
异常产生 当我们迭代一个ArrayList或者HashMap时,如果尝试对集合做一些修改操作(例如删除元素),可能会抛出java.util.ConcurrentModificationExceptio ...
随机推荐
- linux svn 多项目设置
cd /svn/repos svnadmin create project_a svnadmin create project_b cd project_a cp -a conf /svn/ cd / ...
- C++解析八-多态
多态多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态.C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数.下面的实例中,基类 Sh ...
- C++实现 电子邮件客户端程序(简易版)
#Windows操作系统下 用命令行工具实现发送邮件(编程前工作) 步骤: 1.telnet连接服务器(以用QQ邮箱向网易邮箱发送邮件为例,端口号25) 2.返回220 说明连接成功 3.ehlo发送 ...
- 解决jmeter乱码
1. 解决响应数据乱码的方法: 在jemter文件下找到bin\jmeter.properties添加下面一句话: sampleresult.default.encoding=UTF-8 ...
- 新建虚拟机并与XShell连接(配置网卡)
新建虚拟机并与XShell连接 一.新建虚拟机 下一步 下一步 选择CentOS版本,我的CentOS镜像是6.5版本64位,所以我选择CentOS 6 64. 然后点击下一步 可以自行更改位置,然后 ...
- Linux CentOS6.8 项目部署脚本实现
面向刚接触linux环境的新手,老鸟勿拍~ 部署环境及配置: tomcat9,maven3.3.9,git 1.12.0 ##定义一些变量,将需要用到的 source目录,项目目录,名称等定义变量,方 ...
- Unity C#图片转换二进制流、字符串互转
图片转二进制流转换图片互转 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- 产生10个随机数5-9之间 统计一个int类型的一维数组中有多少个在[min,max]之间的数
* 产生10个随机数5-9之间 统计一个int类型的一维数组中有多少个在[min,max]之间的数 */ import java.util.*; public class Demo{ public s ...
- yii2 获取模块名、控制器名、方法名
在视图中: 模块名 $this->context->module->id控制器名 $this->context->id方法名 $this->context-> ...
- 【SpringBoot】Logback日志框架介绍和SpringBoot整合实战
========================11.Logback日志框架介绍和SpringBoot整合实战 2节课================================ 1.新日志框架L ...