Java在Map中存放重复key

1.概述

本文介绍几种处理Map中一个key对多个value的方法。在JDK标准Map实现中当我们尝试在一个key下插入多个value,那么后续的value会覆盖前面的value。

Map

assertThat(map.put(“key1”, “value1”)).isEqualTo(null);

assertThat(map.put(“key1”, “value2”)).isEqualTo(“value1”);

assertThat(map.get(“key1”)).isEqualTo(“value2”);

2.将集合作为Value

当要处理一个key对多个value的情况,可以将所有value存放在一个集合中。

Map

List

map.put(“key1”, list);

map.get(“key1”).add(“value1”);

map.get(“key1”).add(“value2”);

assertThat(map.get(“key1”).get(0)).isEqualTo(“value1”);

assertThat(map.get(“key1”).get(1)).isEqualTo(“value2”);

这种方式处理有多种缺点并且容易产生错误。我们需要为每个key创建一个集合,同时检查集合是否存在并添加或删除值,在Java 8中可以利用compute()方法来简化代码。

Map

map.computeIfAbsent(“key1”, k -> new ArrayList<>()).add(“value1”);

map.computeIfAbsent(“key1”, k -> new ArrayList<>()).add(“value2”);

assertThat(map.get(“key1”).get(0)).isEqualTo(“value1”);

assertThat(map.get(“key1”).get(1)).isEqualTo(“value2”);

3.使用Apache Commons Collections

添加依赖

3.1 MutiMap

org.apache.commons.collections4.MultiMap接口定义了一个Map,每个key对应一个集合。

MultiMap

map.put(“key1”, “value1”);

map.put(“key1”, “value2”);

assertThat((Collection

.contains(“value1”, “value2”);

这个类非线程安全,4.1版本中已经废弃。

3.2 MultiValuedMap

org.apache.commons.collections4.MultiValuedMap这个接口有多种实现,如ArrayListValuedHashMap与HashSetValuedHashMap。

使用方式如下:

MultiValuedMap

map.put(“key1”, “value1”);

map.put(“key1”, “value2”);

map.put(“key1”, “value2”);

assertThat((Collection

.containsExactly(“value1”, “value2”, “value2”);

MultiValuedMap

map.put(“key1”, “value1”);

map.put(“key1”, “value1”);

assertThat((Collection

.containsExactly(“value1”);

若不希望value重复那么可以使用HashSetValuedHashMap

MultiValuedMap

map.put(“key1”, “value1”);

map.put(“key1”, “value1”);

assertThat((Collection

.containsExactly(“value1”);

但ArrayListValuedHashMap,HashSetValuedHashMap及HashSetValuedHashMap都不是线程安全的。为了线程安全可以使用UnmodifiableMultiValuedMap。

@Test(expected = UnsupportedOperationException.class)

public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() {

MultiValuedMap

map.put(“key1”, “value1”);

map.put(“key1”, “value2”);

MultiValuedMap

MultiMapUtils.unmodifiableMultiValuedMap(map);

immutableMap.put(“key1”, “value3”);

4.Guava Multimap

4.1 LinkedHashMultimap

这个类按插入顺序存放插入元素

Multimap

map.put(“key1”, “value3”);

map.put(“key1”, “value1”);

map.put(“key1”, “value2”);

assertThat((Collection

.containsExactly(“value3”, “value1”, “value2”);

4.2 TreeMultimap

这个类按可以按自然序访问插入的元素

Multimap

map.put(“key1”, “value3”);

map.put(“key1”, “value1”);

map.put(“key1”, “value2”);

assertThat((Collection

.containsExactly(“value1”, “value2”, “value3”);

5.自定义MultiMap

如果使用Guava,那么还可以使用Multimap.newMultimap()来定制我们的Map。

6.总结

一对多思路就是通过集合来存储元素,guava和apache collection为我们提供了现成的工具,如果想自定义还可以使用guava提供的扩展方法来实现。

Original: https://www.cnblogs.com/interdrp/p/16516131.html
Author: 锐洋智能
Title: Java在Map中存放重复key

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538631/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringCloud+Alibaba微服务教程,Java自学/进阶程序员必看

    正文 Spring Cloud是目前市面上最火爆的Java微服务技术栈,因其功能丰富涉及微服务管理全面,并且在高可靠、高可阔以及在应对复杂业务和承受并发的能力上发挥出色,使其受到众…

    Java 2023年6月9日
    070
  • RabbitMQ CLI 管理工具 rabbitmqadmin(管理和监控)

    插个广告,公司最近在招”.NET”开发(杭州),如果你现在还从事 .NET 开发(想用 .NET Core,但被公司不认可),想转 JAVA 开发(但又没有…

    Java 2023年5月30日
    046
  • MySQL搭建主从集群详细步骤~

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    051
  • java面试题(2022最新)

    JDK 和 JRE 有什么区别?JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。…

    Java 2023年6月6日
    056
  • java.lang.IllegalArgumentException: Cannot format given Object as a Date

    在进行日期转换的时候遇到了这个问题, 非常的恼火 查看API发现了问题, format(Date date) 这个方法的参数只能是Date类型的, 而我传递的是String类型, …

    Java 2023年5月29日
    063
  • 基于alpine构建jdk镜像遇到的坑

    alpine常用于作为 docker的基础镜像,因为它很小,功能精简,基本上没有啥漏洞,记录一下最近用 alpine作为基础镜像构建 java 8镜像 下面的问题在 oracle …

    Java 2023年6月16日
    053
  • Java中使用FTPClient上传下载

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包…

    Java 2023年5月29日
    069
  • 链表反转类算法题

    反转链表类 NO1. 反转链表 给定一个长度为 n 的链表,反转该链表,输出表头。 方法一:迭代法(推荐使用) 算法流程: step 1 :特殊情况判断,空链表或只有一个结点的链表…

    Java 2023年6月15日
    078
  • JAVA的Proxy动态代理在自动化测试中的应用

    JAVA的动态代理,在MYBATIS中应用的很广,其核心就是写一个interface,但不写实现类,然后用动态代理来实例化并执行这个interface中的方法,话不多说,来看一个实…

    Java 2023年5月29日
    067
  • 复杂任务中,流程的解耦设计

    做事不能急,得一步异步的来; 一、业务场景 在系统开发的过程中,必然存在耗时极高的动作,是基于请求响应模式无法解决的问题,通常会采用解耦的思维,并基于异步或者事件驱动的方式去调度整…

    Java 2023年6月15日
    073
  • Docker 安装 MySQL、Redis

    1 Docker 中安装 Redis 1.1 创建目录 在硬盘上创建 redis 的数据目录: mkdir -p /Users/yygnb/dockerMe/redis/data …

    Java 2023年6月16日
    071
  • Spring Boot入门系列(十六)使用pagehelper实现分页功能

    一、pagehelper介绍 pageHelper是一款非常简单、易用的分页插件,它能很好的集成在spring boot中。它是一个基于mybatis的一款插件,所以我们在使用它时…

    Java 2023年5月30日
    084
  • SSM-注解开发

    Day4 Spring 注解开发 Srping原始注解主要是替代Bean标签配置 Spring 原始注解 @Component 在类上实例化Bean @Controller 在we…

    Java 2023年6月5日
    059
  • Kubernetes-Statefulset

    1. 简介 StatefulSet 是用来管理 &#x6709;&#x72B6;&#x6001;&#x5E94;&#x7528;的工作负载A…

    Java 2023年6月7日
    078
  • 〖Spring Cloud〗Feign:基于服务端的负载均衡

    Feign:负载均衡(基于服务端) 相关视频教程(来自动力节点):https://www.bilibili.com/video/BV1nK4y1j7gL Feign是声明式Web …

    Java 2023年6月7日
    057
  • RocketMQ入门介绍

    简介 用官方的话来说,RcoketMQ 是一款低延迟、高可靠、可伸缩、易于使用的消息中间件,具有以下特性(ps:对于这些特性描述,大家简单过一眼就即可,深入学习之后自然就明白了):…

    Java 2023年5月30日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球