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相关推荐

  1. 关于Java中的Map遍历方式比较

    最近在看阿里巴巴最新版的Java开发手册,里面的内容还是很值得去阅读学习,下面是我对Java中Map的遍历方式的比较和总结: 第一种:使用entrySet()的形式来遍历,也是效率高,推荐使用的一种遍 ...

  2. java map遍历删除_Java Map在遍历过程中删除元素

    map遍历判断筛选删除时 如果对map使用put.remove或clear方法(例如map.remove直接删除),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModific ...

  3. 原生JS forEach()和map()遍历的区别以及兼容写法

    一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...

  4. java map string stu_Java Map遍历的三种方式 | 学步园

    最近经常碰到Map遍历的问题,在网上查找资料后,记录下,权当备忘~~~~~~ 这里给出了三种遍历的方式,注释中已说明各自方式的优点. package edu.hrbeu.cloud.testIterM ...

  5. go语言map遍历时删除是安全的, 且可以完全删除

    结论: map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果如下图: 代码如下: package main import ("fmt" ) func main() {x ...

  6. go语言 sync.map遍历时删除可以全部删除

    结论: sync.map遍历时删除操作是完全的,且可以完全删除指定的元素 实验结果下图: 代码如下: package mainimport ("fmt""sync&quo ...

  7. java 轻量级map,java Map 遍历速度最优解

    java Map 遍历速度最优解 第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (ite ...

  8. Map 遍历取值及jstl的取值

    Map 遍历取值及jstl的取值 学习了:http://blog.csdn.net/yanjiaye520/article/details/17354239 1.Java map的便利取值 Java代 ...

  9. 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 ...

最新文章

  1. vs2010 调试窗口debugger UTF8 显示汉字 乱码
  2. 教你如何阅读Oracle数据库官方文档
  3. 常用,好用的js代码
  4. hdu 5621 KK's Point(数学,推理题)
  5. 硬件基础:虚拟内存相关知识介绍?
  6. github大学课程_GitHub基础教程:如何使用GitHub课程
  7. 揭秘!一个高准确率的Flutter埋点框架如何设计
  8. ctr 平滑_CTR预估中的贝叶斯平滑方法及其代码实现
  9. 密码学研究-加密解密
  10. bzoj 1552: [Cerc2007]robotic sort bzoj 3506: [Cqoi2014]排序机械臂(splay区间翻转)
  11. android 图片查看器
  12. 细心微服务架构的优势与不足那点事
  13. 计算机地图制图符号制作的心得,计算机地图制图实习报告.docx
  14. Redis6.0.6_06_Redis 集群
  15. [原]【原创】无锁编程技术及实现
  16. 计算机图形学-直线裁剪算法
  17. mysql 主从复制 error 1677
  18. SAP批量查询组件BOM引用报表
  19. 一汽大众迈腾车前悬架系统设计
  20. scratch实现猫捉老鼠(下)

热门文章

  1. MATLAB之相关函数
  2. 在Fedora 14上安装Sun JDK 6 (转载)
  3. 区块链与边缘计算(1)基本概念
  4. (chap6 Http首部) 报文首部
  5. ajax简单实战例子
  6. BUU——WMCTF2020 - easy_re
  7. 【Flask项目2】生成token和验证token(11)
  8. pr如何处理音效_Pr基础全通关:从0到1,进阶剪辑大神
  9. GetLogicalDriveStrings FindFirstVolume和FindNextVolume
  10. 009 Android之ContentProvider