Java中合并两个Key相同的HashMap应使用merge()方法或遍历手动合并,而非putAll()覆盖;Integer类型常用Integer::sum求和,String可拼接,List可合并,Stream方式可生成不可变新Map。

Java 中合并两个 Key 相同的 HashMap,核心是“按 Key 合并 Value”,而不是简单覆盖或丢弃。具体策略取决于 Value 的类型和业务需求,比如 Integer 类型常做求和,String 类型可能拼接,自定义对象需自定义逻辑。
用 putAll() 只能覆盖,不满足“合并”需求
putAll() 会用第二个 map 的 value 完全替换第一个 map 中相同 key 的 value,属于“后覆盖前”,不是真正意义上的合并。例如:
map1: {a=1, b=2},map2: {a=3, b=4} → putAll 后变成 {a=3, b=4},原始值丢失。
推荐方式:遍历第二个 map,手动合并到第一个中
这是最通用、最可控的方式,适合所有 Value 类型。关键点是:对每个 key,先查第一个 map 是否已有该 key,有则按规则合并,无则直接 put。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 对 Integer/Double 等数值类型,常用 相加:
map1.merge(key, value, Integer::sum) - 对 String 类型,可拼接(如加逗号):
map1.merge(key, value, (v1, v2) -> v1 + "," + v2) - 对 List 类型,可合并成新 List:
map1.merge(key, new ArrayList(Collections.singletonList(value)), (list1, list2) -> { list1.addAll(list2); return list1; })
更简洁:用 merge() 方法一行搞定(Java 8+)
Map.merge(key, value, remappingFunction) 是专为这种场景设计的:如果 key 不存在,就 put;如果存在,用函数把旧值和新值“算出”新值。
示例(整数累加):
Map<String, Integer> map1 = new HashMap<>() {{ put("a", 10); put("b", 20); }};
Map<String, Integer> map2 = new HashMap<>() {{ put("a", 5); put("c", 30); }};
map2.forEach((k, v) -> map1.merge(k, v, Integer::sum));
// 结果:{a=15, b=20, c=30}
进阶:用 Stream 合并多个 Map(不可变结果)
若不想修改原 map,想生成一个新合并后的 map,可用 Stream 流式处理:
Map<String, Integer> merged = Stream.of(map1, map2)
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
Integer::sum // 冲突时相加
));
注意:此方式创建新 map,原 map 不变;key 冲突时的合并逻辑由第三个参数决定。

















