背??景介绍大家好,我是堆栈管理员。前几天栈长给大家分享了3篇实战文章:3年的开发,我不会循环删除List中的元素,我直接崩溃了!!面试官:如何去除List中的重复元素?一行代码就搞定了,赶快用起来吧!面试官:如何删除HashMap中的元素?一行代码就搞定了,赶快用起来吧!List和Map元素的删除去重是工作中经常遇到的问题。一些有基础的程序员可能会走一些弯路,所以栈长输出了三篇文章,希望对大家有用。有些编程技巧已经很老了。程序员没用过,所以技术真的是无穷无尽。今天栈长带来了集合删除去重系列的最后一篇文章,HashMap中如何删除重复元素,也就是如何根据Value对元素进行去重,HashMap中删除重复的Value元素,这是面试官可能会遇到的问题问。为什么不基于Key去重呢?大家都知道HashMap的key是不会重复的,如果有重复,旧值就会被新值覆盖。当我们向一个HashMap中插入元素时,HashMap会根据key的equals和hashCode方法进行判断。如果使用equals方法两个key的值相同,且key的hashCode值也相同,那么HashMap会认为它们相同。一个键,后续插入具有相同键的键值对将用新值替换旧值。需要注意的是,Java中的基本数据类型和String等内置类已经正确实现了equals和hashCode方法,可以直接作为HashMap的键,不会导致重复键的出现。如果我们使用自定义类的对象作为HashMap的key,需要保证该类正确实现了equals和hashCode方法,否则可能会插入“duplicatekey”。一般情况下,这不符合规范和逻辑。HashMap删除重复元素方案HashMap初始测试数据如下:publicMapinitMap=newHashMap<>(){{put("user1","张三");put("user2","李四");put("user3","张三");put("user4","李四");put("user5","王舞");put("user6","赵六");put("user7","李四");put("user8","王舞");}};本文所有完整示例源码已上传:https://github.com/javastacks/javastack欢迎Star学习,以下Java示例将在此提供!1.新建Map添加非重复元素/***新建Map添加非重复元素*@author:栈长*@from:公众号Java技术栈*/@TestpublicvoidremoveDuplicated1(){Map<字符串,字符串>map=newHashMap<>();initMap.forEach((k,v)->{if(!map.containsValue(v)){map.put(k,v);}});系统输出。println(map);}这个方法很原始。通过创建一个新的HashMap,在添加元素之前进行判断,只有在新的HashMap中不存在的元素才添加。2.添加Set和删除重复元素/***添加Set和删除重复元素*@author:栈长*@from:公众号Java技术栈*/@TestpublicvoidremoveDuplicated2(){Setset=new哈希集<>();Iterator>iterator=initMap.entrySet().iterator();while(iterator.hasNext()){Map.Entryentry=iterator.下一个();如果(!set.add(entry.getValue())){iterator.remove();}}System.out.println(initMap);}这个方法和第一种方法类似,通过创建一个HashSet,然后遍历HashMap,因为HashSet不允许重复元素,所以如果HashSet可以添加元素,说明说明元素不重复,否则说明元素重复,然后删除。另外,HashSet和HashMap的关系也是面试必问的。如果近期准备换工作面试,建议在Java面试库小程序在线刷题,涵盖2000+Java面试题,涵盖几乎所有主流技术面试题。3.使用Stream删除重复元素/***使用Stream删除重复元素*@author:栈长*@from:公众号Java技术栈*/@TestpublicvoidremoveDuplicated3(){MapresultMap=initMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue,Map.Entry::getKey,(key1,key2)->key1)).entrySet().stream().收集(Collectors.toMap(Map.Entry::getValue,Map.Entry::getKey,(key1,key2)->key1));System.out.println(resultMap);}再使用Stream的collect方法进行收集,这个方法也很简单,一行代码搞定,为了可读性,文中的代码做了换行。我不会介绍Stream的基础知识。我之前写过关于Stream系列的主题。不懂的可以关注公众号Java技术栈,然后在公众号Java教程菜单中阅读。Collectors.toMap方法返回一个可以将元素累积到Map中的Collector。Map的键和值将是将提供的映射函数应用于输入元素的结果。如果映射的键包含重复项,值映射函数将使用提供的合并函数合并结果。Collectors.toMap方法可以对Key进行去重合并,这就是为什么要进行两次collect收集:第一次收集:使用Value作为Key,Key作为Value,这样Value就可以去重了,输出结果:{李斯=user2,张三=user1,王五=user8,赵六=user6}虽然可以去重,但是HashMap中的Key和Value是颠倒的,所以需要二次采集。第二次收集:当前的Key是之前的Value,所以需要进行交换,输出结果:{user1=张三,user2=李四,user8=王五,user6=赵六}这种方法比较复杂,虽然一行代码就可以搞定,但是代码非常冗余,不是很优雅。最重要的是,两次收集过程会创建两个新的Map,比较耗内存。总结本文总结了三种HashMap删除重复元素的方式:新建一个Map添加不重复元素添加Set然后删除重复元素(推荐)使用Stream删除重复元素在实际开发过程中,可能会使用不同的遍历方式,使用哪种删除方案可以根据不同的遍历方式来选择,但是推荐使用Set方案,可以直接删除Map中的重复元素,而不需要创建新的HashMap。另外,在遍历集合时,需要考虑是否存在多个线程修改元素,可能会导致并发修改异常。参考上篇文章介绍的解决方案,这里就不写了。本文所有完整示例源码已上传:https://github.com/javastacks/javastack欢迎Star学习,这??里将提供以下Java示例!你身边还有谁不去掉HashMap中的重复元素?把这篇文章发给他,让大家少走弯路,少写垃圾代码,共同进步。你知道哪些HashMap去重技术?欢迎留言分享~好了,今天的分享就到这里了,稍后栈长会分享更多有趣的Java技术和最新的技术资料,关注公众号Java技术栈第一时间推送,我也会Java面试主流题库和参考答案已经整理完毕,大家可以使用Java面试库小程序刷题。版权声明:本文为公众号《Java技术栈》原创。转载、引用本文内容请注明出处。抄袭、洗稿均属侵权投诉,后果自负,并保留追究法律责任的权利。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!