map遍历删除异常:ConcurrentModificationException
1. map集合单个删除
此时,一般都不会出问题,直接 remove(key)
2. map集合遍历删除多个
此时,若不注意往往容易出现问题,出现 ConcurrentModificationException
为什么呢?
使用iterator迭代删除时没有问题的,在每一次迭代时都会调用hasNext()方法判断是否有下一个,是允许集合中数据增加和减少的。
使用forEach删除时,会报错ConcurrentModificationException,因为在forEach遍历时,是不允许map元素进行删除和增加。
所以,遍历删除map集合中元素时,必须使用迭代iterator
3. 案例
有如下集合:
Map<String, Integer> map=new HashMap<>();map.put("张三",22);map.put("李四",25);map.put("王五",33);map.put("赵六",28);map.put("田七",25);map.put("李思",25);map.put("李嘉欣",25);
需求:删除名字(即key)中包含“李”的元素
使用forEach时:
Set<Entry<String, Integer>> set=map.entrySet();for (Entry<String, Integer> entry : set) {String name=entry.getKey();System.out.println(name);System.out.println(name.contains("李"));if(name.contains("李")){map.remove(name);}
}
会报如下异常:
使用iterator时,一切正常
特别注意:删除时不能使用map.remove(key),否则也报ConcurrentModificationException
只能使用iterator.remove
Set<Entry<String, Integer>> set=map.entrySet();Iterator<Entry<String, Integer>> iterator=set.iterator();while(iterator.hasNext()){Entry<String, Integer> entry=iterator.next();String name=entry.getKey();if(name.contains("李")){//特别注意:不能使用map.remove(name) 否则会报同样的错误iterator.remove();}
}
解释:Iterator.remove()是删除最近(最后)使用next()方法的元素。
从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。
完成代码:
package map遍历和删除;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;/*map集合遍历删除*/
public class Test2 {public static void main(String[] args) {//key=name value=ageMap<String, Integer> map=new HashMap<>();map.put("张三",22);map.put("李四",25);map.put("王五",33);map.put("赵六",28);map.put("田七",25);map.put("李思",25);map.put("李嘉欣",25);//单个删除删--remove map.remove("张三");for(Map.Entry<String, Integer> entry:map.entrySet()){System.out.println(entry.getKey()+"="+entry.getValue());}//需求:删除名字(即key)中包含“李”的元素/*分析:* 1.此时直接map.remove(key)就不符合要求了,必须进行遍历删除* * 2.通常map集合遍历就两种方式,一个foreach和iterator* */Set<Entry<String, Integer>> set=map.entrySet();/*for (Entry<String, Integer> entry : set) {String name=entry.getKey();System.out.println(name);System.out.println(name.contains("李"));if(name.contains("李")){map.remove(name);}}*/Iterator<Entry<String, Integer>> iterator=set.iterator();while(iterator.hasNext()){Entry<String, Integer> entry=iterator.next();
// String name=entry.getKey();String name=entry.getKey();int value=entry.getValue();if(name.contains("李")){//特别注意:不能使用map.remove(name) 否则会报同样的错误iterator.remove();}}System.out.println();for (Entry<String, Integer> entry : set) {System.out.println("姓名:"+entry.getKey()+",年龄:"+entry.getValue());}}
}
map遍历删除异常:ConcurrentModificationException相关推荐
- 关于Java中的Map遍历方式比较
最近在看阿里巴巴最新版的Java开发手册,里面的内容还是很值得去阅读学习,下面是我对Java中Map的遍历方式的比较和总结: 第一种:使用entrySet()的形式来遍历,也是效率高,推荐使用的一种遍 ...
- java map遍历删除_Java Map在遍历过程中删除元素
map遍历判断筛选删除时 如果对map使用put.remove或clear方法(例如map.remove直接删除),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModific ...
- 原生JS forEach()和map()遍历的区别以及兼容写法
一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...
- java map string stu_Java Map遍历的三种方式 | 学步园
最近经常碰到Map遍历的问题,在网上查找资料后,记录下,权当备忘~~~~~~ 这里给出了三种遍历的方式,注释中已说明各自方式的优点. package edu.hrbeu.cloud.testIterM ...
- go语言map遍历时删除是安全的, 且可以完全删除
结论: map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果如下图: 代码如下: package main import ("fmt" ) func main() {x ...
- go语言 sync.map遍历时删除可以全部删除
结论: sync.map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果下图: 代码如下: package mainimport ("fmt""sync&quo ...
- java 轻量级map,java Map 遍历速度最优解
java Map 遍历速度最优解 第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (ite ...
- Map 遍历取值及jstl的取值
Map 遍历取值及jstl的取值 学习了:http://blog.csdn.net/yanjiaye520/article/details/17354239 1.Java map的便利取值 Java代 ...
- Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)
Map遍历 import java.util.Map; import java.util.HashMap; import java.util.HashSet; import java.util.Ite ...
最新文章
- vs2010 调试窗口debugger UTF8 显示汉字 乱码
- 教你如何阅读Oracle数据库官方文档
- 常用,好用的js代码
- hdu 5621 KK's Point(数学,推理题)
- 硬件基础:虚拟内存相关知识介绍?
- github大学课程_GitHub基础教程:如何使用GitHub课程
- 揭秘!一个高准确率的Flutter埋点框架如何设计
- ctr 平滑_CTR预估中的贝叶斯平滑方法及其代码实现
- 密码学研究-加密解密
- bzoj 1552: [Cerc2007]robotic sort bzoj 3506: [Cqoi2014]排序机械臂(splay区间翻转)
- android 图片查看器
- 细心微服务架构的优势与不足那点事
- 计算机地图制图符号制作的心得,计算机地图制图实习报告.docx
- Redis6.0.6_06_Redis 集群
- [原]【原创】无锁编程技术及实现
- 计算机图形学-直线裁剪算法
- mysql 主从复制 error 1677
- SAP批量查询组件BOM引用报表
- 一汽大众迈腾车前悬架系统设计
- scratch实现猫捉老鼠(下)