(一)HashMap的遍历

HashMap的遍历主要有两种方式:

第一种采用的是foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况。

HashMap myHashMap;

for (Map.entry item : myHashMap.entrySet()){

K key = item.getKey();

V val = item.getValue();

//todo with key and val

//WARNING: DO NOT CHANGE key AND val IF YOU WANT TO REMOVE ITEMS LATER

}

第二种采用迭代器遍历,不仅适用于HashMap,对其它类型的容器同样适用。

采用这种方法的遍历,可以用下文提及的方式安全地对HashMap内的元素进行修改,并不会对后续的删除操作造成影响。

for (Iterator> it = myHashMap.entrySet().iterator; it.hasNext();){

Map.Entry item = it.next();

K key = item.getKey();

V val = item.getValue();

//todo with key and val

//you may remove this item using "it.remove();"

}

(二)HashMap之删除元素

如果采用第一种的遍历方法删除HashMap中的元素,Java很有可能会在运行时抛出异常。

HashMap myHashMap = new HashMap<>();

myHashMap.put("1", 1);

myHashMap.put("2", 2);

for (Map.Entry item : myHashMap.entrySet()){

myHashMap.remove(item.getKey());

}

for (Map.Entry item : myHashMap.entrySet()){

System.out.println(item.getKey());

运行上面的代码,Java抛出了java.util.ConcurrentModificationException的异常。并附有如下信息。

at java.util.HashMap$HashIterator.nextNode(Unknown Source)

at java.util.HashMap$EntryIterator.next(Unknown Source)

at java.util.HashMap$EntryIterator.next(Unknown Source)

可以推测,由于我们在遍历HashMap的元素过程中删除了当前所在元素,下一个待访问的元素的指针也由此丢失了。

所以,我们改用第二种遍历方式。

代码如下:

for (Iterator> it = myHashMap.entrySet().iterator(); it.hasNext();){

Map.Entry item = it.next();

//... todo with item

it.remove();

}

for (Map.Entry item : myHashMap.entrySet()){

System.out.println(item.getKey());

}

运行结果没有显示,表明HashMap中的元素被正确删除了。

(三)在HashMap的遍历中删除元素的特殊情况

上述方法可能足以应付多数的情况,但是如果你的HashMap中的键值同样是一个HashMap,假设你需要处理的是 HashMap, Double> myHashMap 时,很不碰巧,你可能需要修改myHashMap中的一个项的键值HashMap中的某些元素,之后再将其删除。

这时,单单依靠迭代器的 remove() 方法是不足以将该元素删除的。

例子如下:

HashMap, Integer> myHashMap = new HashMap<>();

HashMap temp = new HashMap<>();

temp.put("1", 1);

temp.put("2", 2);

myHashMap.put(temp, 3);

for (Iterator, Integer>>

it = myHashMap.entrySet().iterator(); it.hasNext();){

Map.Entry, Integer> item = it.next();

item.getKey().remove("1");

System.out.println(myHashMap.size());

it.remove();

System.out.println(myHashMap.size());

}

结果如下:

1

1

虽然 it.remove(); 被执行,但是并没有真正删除元素。

原因在于期望删除的元素的键值(即 HashMap temp )被修改过了。

解决方案:

既然在这种情况下,HashMap中被修改过的元素不能被删除,那么不妨直接把待修改的元素直接删除,再将原本所需要的“修改过”的元素加入HashMap。

想法很好,代码如下:

for (Iterator, Integer>>

it = myHashMap.entrySet().iterator(); it.hasNext();){

Map.Entry, Integer> item = it.next();

//item.getKey().remove("1");

HashMap to_put = new HashMap<>(item.getKey());

to_put.remove("1");

myHashMap.put(to_put, item.getValue());

System.out.println(myHashMap.size());

it.remove();

System.out.println(myHashMap.size());

}

但是依然是RE:

Exception in thread "main" java.util.ConcurrentModificationException

at java.util.HashMap$HashIterator.remove(Unknown Source)

原因在于,迭代器遍历时,每一次调用 next() 函数,至多只能对容器修改一次。上面的代码则进行了两次修改:一次添加,一次删除。

既然 java.util.ConcurrentModificationException 异常被抛出了,那么去想办法拿掉这个异常即可。

最后的最后,我决定弃HashMap转投ConcurrentHashMap。将myHashMap定义为ConcurrentHashMap之后,其它代码不动。

运行结果如下:

2

1

最终,通过ConcurrentHashMap和一些小技巧的使用,变形实现了对被修改过键值的元素的删除。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

hashmap移除元素_Java HashMap 如何正确遍历并删除元素的方法小结相关推荐

  1. java使用迭代器删除元素_使用Java从地图中删除元素

    java使用迭代器删除元素 关于从Java中的Map删除元素的非常简短的文章. 我们将专注于删除多个元素,而忽略了您可以使用Map.remove删除单个元素的Map.remove . 以下Map将用于 ...

  2. 浅谈为什么倒序遍历List删除元素没有问题

    要搞清楚这个问题,首先要知道如何正确的遍历List删除元素.注:下述代码完整版附在末尾. 先给出这次测试的list初始化结构: list.add("a");list.add(&qu ...

  3. C++ vector容器遍历并删除元素

    在使用C++ vector的迭代器遍历并删除元素时,存在一些不注意的误区,这里特此记录. 在使用迭代器遍历vector元素时,错误的删除方法: vector<int>::iterator ...

  4. List遍历中删除元素

    List遍历主要有索引下标遍历.for循环遍历和Iterator迭代遍历,索引下标和for循环在遍历中删除元素都存在问题,Iterator迭代可以实现遍历中删除元素. 索引下标遍历 List<I ...

  5. cocos2d-x CCArray用法 遍历和删除元素

    本文为 justbilt 原创,转载请标明原作者及原文出处,以示尊重! 作者:justbilt 原文:http://blog.justbilt.com/25/ 一.基本用法 1.声明初始化变量 C++ ...

  6. foreach遍历list删除元素一定会报错?

    foreach遍历list集合删除某些元素一定会报错吗? 先上一段代码: List list = new ArrayList(); list.add("1"); list.add( ...

  7. HashMap遍历中删除元素报错

    文章目录 一.问题描述 二.问题分析 三.解决问题 四.相关问题 一.问题描述 HashMap在遍历的时候进行删除元素报错java.util.ConcurrentModificationExcepti ...

  8. java_基础_遍历map删除元素_Java 遍历Map(包括集合)时,修改删除元素

    转载自:https://blog.csdn.net/weixin_33498283/article/details/114071025 1.遍历Map集合的四种方法 public staticvoid ...

  9. python 遍历list删除元素_详解Python遍历列表时删除元素的正确做法

    这篇文章主要介绍了详解Python遍历列表时删除元素的正确做法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.问题描述 这是 ...

最新文章

  1. mysql的profile_Mysql分析-profile详解
  2. python 多线程 多进程 zmq_研二硕, Python +pyqt,多进程问题求助
  3. 华为mate8怎么申请云闪付_华为消费者管培生面试问题分享
  4. JS实现标签页效果(配合css)不同标签下对应不同div
  5. include_fns.php_管理页面
  6. Maven教程(一)
  7. 673. Number of Longest Increasing Subsequence
  8. 部署Symantec Antivirus 10.0网络防毒服务器之七
  9. XOS 源码详解2: os_s_xxxx.s 汇编代码的段定义AREA,程序入口ENTRY,程序结尾END.
  10. krpano点击场景获取点击位置的场景坐标
  11. Redis 如何实现库存扣减操作和防止被超卖?(荣耀典藏版)
  12. 用python对数据进行主成分分析、类概念描述及特征化分析-实验报告
  13. 假设有一段英文,其中有单独的字母I误写为i,请编写程序进行纠正。
  14. java货郎担问题求解_货郎担问题(TSP)
  15. SCI期刊写作必备(二):代码|手把手绘制目标检测领域YOLO论文常见的性能对比折线图,一键生成YOLOv7等主流论文同款图表,包含多种不同功能风格对比图表
  16. java基础语法(继承)
  17. Day7 String类
  18. python的字典生成工具
  19. 计蒜客--天上的星星
  20. 多校联考 CSP-J 2019 第三次模拟赛 题解

热门文章

  1. 大剑无锋之了解什么是CAP吗?【面试推荐】
  2. Hive的四种存储方式Stored as ?
  3. 左神算法:二叉树的按层打印与ZigZag打印(Java版)
  4. 【PAT甲级 最长公共子串】1007 Maximum Subsequence Sum (25 分) C++ 全部AC
  5. 【Java入门】package包
  6. 分布式事务理论(学习笔记)
  7. mysql时间与字符串相互转换
  8. MySQL + springboot修改时区的方法小结
  9. Java配置信息工具jinfo
  10. nodeJS 的 path.resolve() 用法解析