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 ...
随机推荐
- Oracle优化之旅:使用leading, use_nl, rownum调优例子
1.使用leading和use_nl来设置表的查询顺序,来加快查询速度,一般把小表设为第一个表. /*+LEADING(TABLE)*/ 将指定的表作为连接次序中的首表. /*+USE_NL(TAB ...
- Python—字符串的操作
字符串的操作 变量: 变量只能是 字母,数字或下划线的任意组合,但首个字符不能为数字,且不能有空格 以下关键字不能声明为变量: and ,as, assert, break ,class ,conti ...
- Python-接口自动化(一)
python基础知识(一) 一.python语言特点 1.易于学习:python有相对较少的关键字,结构简单,有一个明确定义的语法,学起来比较简单: 2.易于阅读:python代码定义的更清晰: 3. ...
- redis不重启,切换RDB备份到AOF备份
确保redis版本在2.2以上 [root@pyyuc /data ::]#redis-server -v Redis server v= sha=: malloc=jemalloc- bits= b ...
- centos 安装桌面系统
yum -y groupinstall "Desktop" "Desktop Platform" "X Window System" &qu ...
- Jmeter的察看结果树 出现乱码的解决方法
在apache-jmeter-3.0\bin目录下, 用Notepad工具打开jmeter.properties文件 在文件中搜索encoding,可以搜素到1030行: #sampleresult. ...
- MySQL:视图
视图 一.视图的概述 1. 含义:是从数据库中一个或多个表中导出的虚拟表2. 作用:①简单化 ②安全性 ③逻辑数据独立性3. 注意:一个表可以由多个视图: 二.视图的创建 1. 总的语法形式 CREA ...
- centos 升级python3
升级pip3 wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py 升级python3 yum install epel-r ...
- escu问题及解决
************************************************************** Qt 出现“undefined reference to `vtable ...
- STL:unique()函数
unique() unique()是剔除重复他是剔除相邻之间字符重复的,倘若其中中的字符前后之间是没有重复的,unique函数是起不到作用的,所以使用以前都会sort处理. unique()函数的返回 ...