You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:37