Java如何合并两个HashMap?重复键对应值需累加
Java合并HashMap并累加重复Key值的内置方案
哈哈,太懂这种自己手动实现合并逻辑越搞越乱的滋味了!Java早就为这种常见场景准备了现成的解决方案,尤其是Java 8及以上版本,写法简洁还不容易出错,完美匹配你要的重复Key累加值的需求。
先纠正个小细节:HashMap的泛型不能用基本类型int,实际要写成HashMap<String, Integer>哦,下面的示例都会用正确的类型。
一、Java 8+ 最优雅的方式:使用merge()方法
Map接口从Java 8开始新增的merge()方法,专门用来处理合并时的Key冲突,核心逻辑是:
- 如果Key不存在,直接把新的Key-Value放进去
- 如果Key已存在,用你指定的规则计算新值(这里就是累加)
1. 合并到已有Map(修改原Map)
如果可以接受修改其中一个原Map,直接遍历另一个Map并调用merge:
// 初始化两个HashMap HashMap<String, Integer> hm1 = new HashMap<>(); hm1.put("foo", 1); hm1.put("bar", 1); HashMap<String, Integer> hm2 = new HashMap<>(); hm2.put("foo", 1); hm2.put("main", 1); // 将hm2合并到hm1,重复Key时累加值 hm2.forEach((key, value) -> hm1.merge(key, value, Integer::sum)); // 此时hm1的内容就是你要的结果:{foo=2, bar=1, main=1}
这里的Integer::sum是方法引用,等价于(oldVal, newVal) -> oldVal + newVal,用来定义重复Key时的计算规则。
2. 生成新的合并Map(不修改原Map)
如果不想破坏原来的两个Map,先复制其中一个的内容到新Map,再执行合并:
HashMap<String, Integer> mergedMap = new HashMap<>(hm1); // 先复制hm1的所有内容 hm2.forEach((key, value) -> mergedMap.merge(key, value, Integer::sum)); // mergedMap是合并后的新Map,hm1和hm2保持不变
二、Java 8之前的兼容写法(手动遍历)
如果项目还在使用Java 8之前的版本,就得手动遍历处理,但写法会繁琐一些:
HashMap<String, Integer> mergedMap = new HashMap<>(hm1); for (Map.Entry<String, Integer> entry : hm2.entrySet()) { String key = entry.getKey(); Integer newValue = entry.getValue(); if (mergedMap.containsKey(key)) { // Key已存在,累加值 mergedMap.put(key, mergedMap.get(key) + newValue); } else { // Key不存在,直接放入 mergedMap.put(key, newValue); } }
这种写法要注意自己处理所有边界情况(比如值为null的场景),不如merge()方法省心。
为什么不推荐自己造轮子?
手动实现很容易踩坑:比如忘记处理并发修改异常、漏判null值、逻辑冗余导致性能低下,而Java内置的merge()方法已经经过大量测试,既高效又可靠,完全没必要自己折腾复杂逻辑。
内容的提问来源于stack exchange,提问作者ZpfSysn
相关产品推荐
相关产品推荐

