Java中合并两个HashMap最常用、最推荐的方式是putAll()方法,它将一个Map的所有键值对复制到另一个可变Map中,相同key的值自动覆盖,时间复杂度为O(n)。

Java 中合并两个 HashMap 最常用、最推荐的方式是使用 putAll() 方法,它会将一个 Map 的所有键值对复制到另一个 Map 中;若存在相同 key,则后加入的值会覆盖原有值。
用 putAll() 合并(基础且高效)
这是最直接的方式,适用于大多数场景,要求目标 Map 可修改:
- 调用方 Map 必须是可变的(如 new HashMap()),不能是不可变 Map(如 Collections.unmodifiableMap 或 Map.of())
- 重复 key 的值会被自动覆盖,无需额外处理
- 时间复杂度为 O(n),n 是待合并 Map 的大小
HashMap<String, Integer> map1 = new HashMap<>();
map1.put("a", 1);
map1.put("b", 2);
HashMap<String, Integer> map2 = new HashMap<>();
map2.put("b", 3); // 与 map1 冲突
map2.put("c", 4);
map1.putAll(map2); // 合并:map1 现在含 {"a":1, "b":3, "c":4}
合并并保留原 Map 不变(创建新 Map)
如果不想修改任一原始 Map,可新建一个 Map 并分别 putAll:
- 先复制第一个 Map(用构造函数或 clone),再 putAll 第二个
- 注意:HashMap 构造函数支持传入已有 Map,会自动完成初始化复制
HashMap<String, Integer> merged = new HashMap<>(map1); merged.putAll(map2); // map1 和 map2 均未被修改
自定义合并逻辑(如数值累加)
当遇到相同 key 时不想覆盖,而是想合并值(比如整数相加、列表合并),可用 merge() 或循环 + computeIfPresent/absent:
立即学习“Java免费学习笔记(深入)”;
-
merge(key, value, remappingFunction):key 存在则用函数处理旧值和新值,不存在则直接插入 - 适合计数类场景(如统计词频)
HashMap<String, Integer> result = new HashMap<>(map1);
map2.forEach((k, v) -> result.merge(k, v, Integer::sum));
// 若 map1.get("b")=2,map2.get("b")=3 → result.get("b")=5
Java 8+ 推荐:用 Stream 合并(函数式风格)
适合链式操作或需过滤/转换后再合并的场景,但性能略低于 putAll:
- 将两个 Map 转为 entrySet 流,用 flatMap 合并,再 collect 到新 Map
- 用
Collectors.toMap()时必须指定冲突解决策略(第三个参数)
Map<String, Integer> merged = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v2 // 冲突时用第二个值
));
不复杂但容易忽略


















