当前位置: 首页 > news >正文

java map<String,List>判断是否有key,get(key.add(x),否则put(key,new list(){x})的新写法

在Java中,你可以通过几种方式实现这个逻辑。以下是几种常见的实现方法:

方法1:传统方式(使用 containsKey)

Map<String, List<String>> map = new HashMap<>(); public void addValue(String key, String value) { if (map.containsKey(key)) { map.get(key).add(value); } else { List<String> newList = new ArrayList<>(); newList.add(value); map.put(key, newList); } }

方法2:使用 getOrDefault(Java 8+)

Map<String, List<String>> map = new HashMap<>(); public void addValue(String key, String value) { List<String> list = map.getOrDefault(key, new ArrayList<>()); list.add(value); map.put(key, list); }

方法3:使用 computeIfAbsent(推荐,Java 8+)

Map<String, List<String>> map = new HashMap<>(); public void addValue(String key, String value) { map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); }

方法4:使用 putIfAbsent

Map<String, List<String>> map = new HashMap<>(); public void addValue(String key, String value) { map.putIfAbsent(key, new ArrayList<>()); map.get(key).add(value); }

完整示例

import java.util.*; public class MapExample { public static void main(String[] args) { // 使用方法3:computeIfAbsent(最简洁) Map<String, List<String>> map = new HashMap<>(); addToMap(map, "fruit", "apple"); addToMap(map, "fruit", "banana"); addToMap(map, "vegetable", "carrot"); addToMap(map, "fruit", "orange"); System.out.println(map); // 输出: {vegetable=[carrot], fruit=[apple, banana, orange]} } // 使用 computeIfAbsent public static void addToMap(Map<String, List<String>> map, String key, String value) { map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); } }

针对不同类型 List 的通用方法

如果你需要处理不同类型的数据,可以使用泛型:

public class MapUtils { // 通用方法 public static <K, V> void addToListInMap(Map<K, List<V>> map, K key, V value) { map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); } // 使用示例 public static void main(String[] args) { Map<String, List<Integer>> intMap = new HashMap<>(); Map<String, List<Double>> doubleMap = new HashMap<>(); Map<String, List<Object>> objectMap = new HashMap<>(); addToListInMap(intMap, "scores", 100); addToListInMap(doubleMap, "prices", 19.99); addToListInMap(objectMap, "items", "item1"); } }

线程安全版本

如果需要在多线程环境中使用:

Map<String, List<String>> concurrentMap = new ConcurrentHashMap<>(); public void addValueSafely(String key, String value) { // 使用 ConcurrentHashMap 的 computeIfAbsent concurrentMap.computeIfAbsent(key, k -> Collections.synchronizedList(new ArrayList<>()) ).add(value); }

推荐

推荐使用方法3(computeIfAbsent),因为:

  1. 代码最简洁

  2. 避免多次访问Map

  3. 性能较好

  4. 是原子操作(在多线程环境下更安全)

如果你使用的是Java 8之前的版本,可以使用方法1,虽然代码稍长,但兼容性最好。

http://www.gsyq.cn/news/153648.html

相关文章:

  • 微信小程序uniapp-vue社区防控代办跑腿系统
  • 计算机毕业设计springboot高考志愿推荐算法及其应用系统 SpringBoot框架下基于大数据的高考志愿智能匹配与可视化系统 面向新高考改革的Java志愿推荐引擎与线上辅助填报平台
  • 微信小程序uniapp-vue祛痘美容减肥个人健康交流打卡
  • 禅道的操作与抓包
  • 基于Comsol的高坝应力渗流耦合三维分析探索
  • TCP\IP和https流程
  • HTTP安全攻防:常见漏洞原理与防护措施(附练习题)
  • zszsbd
  • 2025论文神器终极榜单:7款工具带真实参考文献,查重低原创高!
  • 人工智能作业--光的折射
  • 深入浅出 HarmonyOS NEXT (迈向 6.0 架构):攻克 ArkTS 高性能状态管理与 NAPI 底层交互难题
  • 光的折射模拟器(斯涅尔定律演示)
  • Web项目完整部署指南
  • Fiddler抓包工具与HTTP连接优化笔记
  • 计算机Java毕设实战-基于springboot的学院失物招领平台的设计与实现基于Springboot+vue失物招领系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • apache jmeter 接口测试
  • 【无标题】用 HTML/CSS/JS 实现光的折射控制器:直观演示斯涅尔定律
  • 10000字讲透C++无锁编程:看完就能写出自己的无锁队列
  • 12月25日
  • 探寻高性价比电池工厂,解锁优质电池新选择
  • 探寻售后好、口碑佳、合作案例多的钢筋网制造厂
  • unittest中使用装饰器来实现环境的动态切换
  • 数眼智能大模型联网搜索 API 实战(附完整可运行代码)
  • URL 操作与缓存调试指南
  • Airtest常用API介绍
  • 2025螺栓厂家推荐排行榜:从产能到质量双维度解析铂迈与群奥优势 - 爱采购寻源宝典
  • 国产突围与进口坚守:解读金相显微镜十大品牌新变局
  • git 新建项目
  • Java毕设项目推荐-基于Java的个人健康信息智慧管理系统的设计与实现基于java的个人健康管理系统的设计与实现【附源码+文档,调试定制服务】
  • 知从青龙队列刷写方案介绍