0

0

如何在Map中存储多个相同键的值_利用List作为Value的MultiMap实现

P粉602998670

P粉602998670

发布时间:2026-03-04 12:34:03

|

138人浏览过

|

来源于php中文网

原创

java无原生multimap,需用map手动管理或guava的multimap;注意空列表清理、线程安全及kotlin中getorput正确用法。

如何在map中存储多个相同键的值_利用list作为value的multimap实现

Java 里没有原生 MultiMap,得自己用 Map<k list>></k>

Java 标准库的 HashMapTreeMap 都不支持重复键——这是设计使然,不是 bug。想存多个值到同一个键下,最直接靠谱的做法就是把 value 类型定为 List(或 ArrayListLinkedList),手动维护列表生命周期。

常见错误是每次 put 都直接覆盖:map.put("k1", Arrays.asList("v1")),下次再 put("k1", ...) 就丢了前一个值。

  • 初始化时用 computeIfAbsent 安全获取或新建列表:map.computeIfAbsent("k1", k -> new ArrayList()).add("v1")
  • 避免每次 new 列表:不用 getOrDefault(key, new ArrayList()),它会在 key 存在时也 new 一次空列表
  • 如果频繁增删、且对顺序无要求,LinkedHashSet 作 value 可去重,但别用 HashSet——迭代顺序不可靠

Guava 的 Multimap 看起来省事,但要注意默认实现不线程安全

Guava 提供了 ArrayListMultimapHashMultimap 这类开箱即用的 Multimap,写法简洁:multimap.put("k1", "v1")multimap.get("k1") 直接返回 Collection

但它的所有标准实现(包括 ArrayListMultimap)都不是线程安全的。多线程并发 put 同一键,可能抛 ConcurrentModificationException 或静默丢数据。

Lexica
Lexica

一个搜索 AI 生成图片的网站,可以上传图片或prompts搜索图片。

下载
  • 需要并发安全?别套 Collections.synchronizedMap,得用 MultiMaps.synchronizedMultimap()
  • get(key) 返回的是视图(view),不是新集合——修改它会直接影响底层 multimap
  • 序列化支持有限:ArrayListMultimap 可序列化,但 TreeMultimap 要求 key/value 都可比较,否则运行时报 ClassCastException

Map<k list>></k> 时,removeclear 容易漏掉清理空列表

手动管理 List 值的最大坑是“删值不删键”:调用 list.remove("v1") 后,如果列表变空,map.get("k1") 仍返回空 List,后续 size() 判断或遍历都得额外判空。

这不是语义错误,但会让逻辑变臃肿,尤其在做统计、过滤或序列化时容易出错。

  • 删完记得检查:if (list.isEmpty()) map.remove("k1")
  • 批量删值建议封装方法,比如 removeAllValues(map, key, values),内部统一处理空列表清理
  • 不要依赖 map.values().stream().filter(List::isEmpty).count() 来判断“是否还有有效映射”——空列表本身就算一个映射项

Kotlin 用户别用 mutableMapOf() 直接套 mutableListOf() 当 value

Kotlin 写 val map = mutableMapOf<string mutablelist>>()</string> 看似没问题,但 map["k1"]?.add("v1") 在 key 不存在时返回 null,不会自动创建列表——这和 Java 的 computeIfAbsent 行为不一致,新手常卡在这儿。

更隐蔽的问题是:Kotlin 的 getOrPut 是安全的,但若传入 { mutableListOf() },每次都会 new 新列表,哪怕 key 已存在(因为 lambda 是惰性求值,但没做存在性短路)。

  • 正确写法:map.getOrPut("k1") { mutableListOf() }.add("v1") —— getOrPut 保证只执行一次 lambda
  • 如果要用不可变语义,map = map + ("k1" to (map["k1"] ?: emptyList()) + "v1") 性能差,别在循环里用
  • Android 开发注意:旧版 Kotlin 标准库中 getOrPut 在某些版本有竞态 bug,建议升级到 1.8+ 或加同步块
事情说清了就结束。真正麻烦的不是怎么存,而是什么时候该删空列表、要不要去重、并发场景下谁负责同步——这些没法靠 API 自动兜底。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

121

2026.02.12

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

270

2024.05.29

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

988

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

839

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

201

2023.11.20

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号