如何优雅的删除HashMap元素

文章目录

  • 1.数据准备
  • 2.删除方式
    • 2.1.使用增强 for 循环删除
    • 2.2.使用 forEach 循环删除
    • 2.3.使用 Iterator 迭代器删除
    • 2.4 使用 removeIf 删除(推荐使用)
    • 2.5.使用 Stream 删除(推荐使用)

1.数据准备

public Map<String, String> initMap = new HashMap<String, String>() {{put("user1", "刘零");put("user2", "郑一");put("user3", "吴二");put("user4", "张三");put("user5", "李四");put("user6", "王五");put("user7", "钱六");put("user8", "孙七");
}};

2.删除方式

2.1.使用增强 for 循环删除

/*** 使用 for 循环删除*/
public void remove1() {Set<Map.Entry<String, String>> entries = new CopyOnWriteArraySet<>(initMap.entrySet());for (Map.Entry<String, String> entry : entries) {if ("王五".equals(entry.getValue())) {initMap.remove(entry.getKey());}}System.out.println(initMap);
}

输出结果:
{user1=刘零, user2=郑一, user7=钱六, user8=孙七, user5=李四, user3=吴二, user4=张三}
通过HashMap的entrySet方法获取元素集合,然后再进行循环遍历,判断value值是否为需要删除的元素,再移除对应的Key。
需要注意增强的 for 循环底层使用的迭代器 Iterator,而 HashMap 是 fail-fast 原则的错误机制,所以遍历时删除元素会出现 java.util.ConcurrentModificationException 并发修改异常。我们可以使用CopyOnWriteArraySet封装一层避免出现并发修改异常。

  • fail-fast:为了将错误或异常情况尽早暴露出来,避免潜在的问题在后续代码中蔓延,提高系统的稳定性和可靠性。

2.2.使用 forEach 循环删除

/*** 使用 forEach 循环删除*/
public void remove2() {ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>(initMap);map.forEach((k, v) -> {if ("王五".equals(v)) {map.remove(k);}});System.out.println(map);
}

输出结果:
{user1=刘零, user2=郑一, user7=钱六, user8=孙七, user5=李四, user3=吴二, user4=张三}
通过HashMap的forEach方法循环删除目标元素,同样的使用了ConcurrentHashMap封装避免出现并发修改异常。

2.3.使用 Iterator 迭代器删除

/*** 使用 Iterator 迭代器删除*/
@Test
public void remove3() {ConcurrentHashMap<String, String> resultMap = new ConcurrentHashMap<>();Iterator<Map.Entry<String, String>> iterator= new ConcurrentHashMap<>(initMap).entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, String> entry = iterator.next();if ("王五".equals(entry.getValue())) {iterator.remove();}else {resultMap.put(entry.getKey(),entry.getValue());}}System.out.println(resultMap);
}

输出结果:
{user1=刘零, user2=郑一, user7=钱六, user8=孙七, user5=李四, user3=吴二, user4=张三}
通过Iterator迭代删除元素不会出现并发修改异常,但由于HashMap是线程不安全的,这时如果多个线程同时修改HashMap数据也会出现并发修改异常 ,日常使用可以先用ConcurrentHashMap封装。

2.4 使用 removeIf 删除(推荐使用)

/*** 使用 removeIf 删除*/
public void remove4() {initMap.entrySet().removeIf(entry -> "王五".equals(entry.getValue()));System.out.println(initMap);
}

输出结果:
{user1=刘零, user2=郑一, user7=钱六, user8=孙七, user5=李四, user3=吴二, user4=张三}
通过entrySet获取元素然后使用removeIf方法删除目标数据;而removeIf的底层是通过Iterator迭代器实现的。所以也存在第三种方法同样的问题。

default boolean removeIf(Predicate<? super E> filter) {Objects.requireNonNull(filter);boolean removed = false;final Iterator<E> each = iterator();while (each.hasNext()) {if (filter.test(each.next())) {each.remove();removed = true;}}return removed;
}

2.5.使用 Stream 删除(推荐使用)

/*** 使用 Stream 删除*/
public void remove5() {Map<String, String> map = initMap.entrySet().stream().filter(entry -> !"王五".equals(entry.getValue())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));System.out.println(map);
}

输出结果:
{user1=刘零, user2=郑一, user7=钱六, user8=孙七, user5=李四, user3=吴二, user4=张三}
通过Stream 的 filter 方法进行过滤,然后生成一个新的map。这种方式“一行代码“就能够实现删除的动作,并且没有并发问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot @Autowired 注入的服务为null

spring boot Autowired 注入的服务为null 技术博客 http://idea.coderyj.com/ 1.今天调试代码发现 Autowired 注入的服务都是null 经过排查发现 是函数的权限不够,应该把private改成 public解决问题 修改前 PostMapping("handelAllCharge") private JsonUtil hande…

SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用

SQL NULL 值 什么是 NULL 值&#xff1f; NULL 值是指字段没有值的情况。如果表中的字段是可选的&#xff0c;那么可以插入新记录或更新记录而不向该字段添加值。此时&#xff0c;该字段将保存为 NULL 值。需要注意的是&#xff0c;NULL 值与零值或包含空格的字段不同。具有 …

【项目问题定位】近来几个数据库相关问题定位与知识点总结

文章目录 数据库回收站积压导致异常现象与排查&#xff1a;知识点总结回收站与PURGEOracle回收站相关的基本操作&#xff1a; 数据库事务重复创建未释放导致的链接泄露现象与排查知识点总结数据库事务未关闭导致的泄露链接泄露的临时恢复 数据库回收站积压导致异常 现象与排查…

JavaScript中的设计模式

目录 1.工厂模式 2.构造函数模式 构造函数中new关键字作用&#xff1a; 3.原型模式 4.组合模式 JavaScript中有四种常见的设计模式 &#xff0c;目的是为了批量创建对象 为了实现继承。 1.工厂模式 利用工厂模式批量创建对象 优点&#xff1a;可以批量创建对象 …

html滑动文章标题置顶

position: sticky; 基于用户的滚动位置来定位 首先封装一个组件 例如&#xff1a;AAA组件&#xff08;注意&#xff0c;只能有一层盒子&#xff0c;不能在外面继续包一层div&#xff09; <template><div class"box">{{title}}</div> </templa…

【Nginx】nginx 解决504超时问题

问题发现 最近在做测试&#xff0c;发现基本有所有接口响应时间过长的错误反馈都是504。 分析 nginx访问出现504 Gateway Time-out&#xff0c;一般是由于程序执行时间过长导致响应超时&#xff0c;例如程序需要执行90秒&#xff0c;而nginx最大响应等待时间为30秒&#xff…

酒店品牌纷纷冲击中高端,东呈集团能否“快人一步”?

过去两年酒店行业加速洗牌&#xff0c;“强者恒强”的马太效应正持续凸显。 报告显示&#xff0c;2022年排名前10名的酒店集团分别为锦江国际、华住、首旅如家、格林、东呈集团、尚美数智、亚朵、德胧、逸柏、都市酒店。以上10家酒店集团客房规模在连锁酒店市场占有率为62.36&…

【EI会议征稿】第四届公共管理与智能社会国际学术会议(PMIS 2024)

第四届公共管理与智能社会国际学术会议&#xff08;PMIS 2024) 2024 4th International Conference on Public Management and Intelligent Society 第四届公共管理与智能社会国际学术会议将在2024年3月15-17日在长沙召开。PMIS 2024由中南大学社会计算研究中心、中南大学公共…

根据nginx日志统计页面访问次数

静态页面部署在nginx上&#xff0c;页面只有查看下载功能。 需求是统计每条访问次数和下载次数&#xff0c;根据日志分析写了一个shell脚本&#xff0c;触发脚本后生成一个html可以远程查看统计的数量。 #!/bin/bash # nginx日志文件路径 LOG_FILE"/usr/local/nginx/l…

Python等于号标红怎么办,可能原因

Python等于号标红 在具有错误提示的开发集成环境中&#xff0c;Python程序如果被标红的位置刚好是在“等于号”&#xff0c;而不是在“等于号”左边的变量名称上&#xff0c;也不是右边的值或表达式上&#xff0c;那么可能的原因就是等于号的语法错误&#xff1a; 即在Python…

OpenCV 卷积运算和卷积核

卷积运算和卷积核 图像运算中经常会碰到卷积运算这个讲法, 初看不知道具体含义, 其实非常简单, 工作原理如下: 首先提供一个小的矩阵, 一般是3*3, 或者是 5*5 或者是 7*7, 一般是方形矩阵, 维度为奇数, 这样中心点可以作为锚点, 矩阵中的元素取值多为很小的整数(或正或负或零),…

注册亚马逊美国买家号需要些什么资料?

注册亚马逊美国买家号需要准备邮箱、美国手机号、美国地址及能支付的支付卡。准备好之后进入亚马逊美国站进行点击注册&#xff0c;按照格式填写好之后即可注册成功了。 而如果想要注册大量买家号&#xff0c;可以使用亚马逊鲲鹏系统进行自动化操作&#xff0c;想要自动化更顺畅…

活动回顾 | 数字外贸私享会【上海站】成功举办

11月17日&#xff0c;由箱讯科技主办的数字外贸高端定制私享会【上海站】成功举办&#xff01;本次会议的主题为“新模式、新商机、新政策”&#xff0c;外贸行业的老板、企业家们齐聚一堂&#xff0c;凝聚共识&#xff0c;共话数字外贸的新趋势和新机遇。 近年来&#xff0c;数…

HTML+CSS+ElementUI搭建个人博客页面(纯前端)

网站演示 搭建过程 html部分 首先下载Vue2&#xff0c;ElementUI等插件&#xff0c;放在你的本地。我这里为了运行方便&#xff0c;把代码放在了一个框架里运行。 下载后引入部分 <link rel"stylesheet" href"{{URL::asset(elementui/lib/theme-chalk/ind…

设计师有哪些副业?优漫教育

1、自我推广 设计师有哪些副业&#xff1f;   正所谓&#xff1a;肥水不流外人田&#xff0c;身边朋友需要做海报logo设计什么的,肯定第一个想到的就是你&#xff0c;那么这里无非就两种情况&#xff1a;   一种情况就是朋友拿你当朋友&#xff0c;设计之前会问清相关…

bank conflicts 理解

1、同一个bank下如果有多个threads access 不同的地址&#xff0c;就会出现bank conflicts, 2、如果是多个threads read 同一个bank内的同一个地址&#xff0c;就是broadcast 模式没有bank conflicts&#xff0c;这种情况下带宽利用率较低&#xff0c;因为只用了一个bank资源…

黑马React18: 基础Part II

黑马React: 基础2 Date: November 16, 2023 Sum: 受控表单绑定、获取DOM、组件通信、useEffect、Hook、优化B站评论 受控表单绑定 受控表单绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 准备一个React状态值 const [value, se…

Linux操作系统的Web服务器优点

Linux操作系统的Web服务器优点 Windows&#xff0c;Linux与Unix这3个操作系统是架设Web服务器比较常见的操作系统。Linux的安全性能在这3个操作系统中最高&#xff0c;可以支持多个硬件平台&#xff0c;其网络功能比较强大。总的来说这两大优点是其他操作系统不可替代的&#…

基于C#实现协同推荐 SlopeOne 算法

一、概念 相信大家对如下的 Category 都很熟悉&#xff0c;很多网站都有类似如下的功能&#xff0c;“商品推荐”,"猜你喜欢“&#xff0c;在实体店中我们有导购来为我们服务&#xff0c;在网络上我们需要同样的一种替代物&#xff0c;如果简简单单的在数据库里面去捞&am…

小迪笔记(1)——操作系统文件下载反弹SHELL防火墙绕过

名词解释 POC&#xff1a;验证漏洞存在的代码&#xff1b; EXP&#xff1a;利用漏洞的代码&#xff1b; payload&#xff1a;漏洞利用载荷&#xff0c; shellcode&#xff1a;漏洞代码&#xff0c; webshell&#xff1a;特指网站后门&#xff1b; 木马&#xff1a;强调控制…