Java中合并两个HashMap最常用方式是putAll(),它批量复制键值对并覆盖重复键的值;也可创建新Map合并以保护原对象;需自定义逻辑时可用merge()方法。

Java 中合并两个 HashMap,最常用、最直接的方式是用 putAll() 方法。它会把一个 Map 的所有键值对“批量复制”到另一个 Map 中;如果键重复,后放入的值会覆盖原有值。
用 putAll() 合并(推荐)
这是最简洁、性能好、语义清晰的方式,适用于大多数场景:
- 目标 Map 必须是可修改的(比如 new 出来的 HashMap,不是
Collections.unmodifiableMap()) - 重复 key 的值会被第二个 Map 的值覆盖(即“后者优先”)
- 不会改变原 Map 的结构(不涉及重新哈希或扩容逻辑,只是遍历 + 插入)
示例:
Mapmap1.put("a", 1);
map1.put("b", 2);
Map
map2.put("b", 20);
map2.put("c", 3);
map1.putAll(map2); // 合并:map1 现在含 {"a":1, "b":20, "c":3}
合并到新 Map(不修改原对象)
如果不想改动任一原始 Map,可以创建一个新 HashMap,并用构造器或 putAll 初始化:
- 方式一:先复制第一个 Map,再 putAll 第二个
- 方式二:Java 9+ 可用
Map.ofEntries()+Stream.concat(),但较繁琐,一般不推荐
推荐写法:
merged.putAll(map2); // map1 和 map2 都保持不变
处理键冲突时自定义逻辑(如相加、保留较大值)
若遇到相同 key 时不想简单覆盖,而是想合并值(比如数值累加),需手动遍历处理:
- 遍历 map2,对每个 entry 判断 map1 是否含该 key
- 如有,按业务规则更新(如
map1.merge(key, value, Integer::sum)) -
merge()是 HashMap 提供的原子方法,比先 get 再 put 更安全简洁
示例(数值相加):
map2.forEach((k, v) -> map1.merge(k, v, Integer::sum));注意点
合并前请确认:
- key 和 value 的类型兼容,尤其是泛型擦除后运行时不会报错但可能逻辑出错
- key 对象必须正确实现
equals()和hashCode(),否则 putAll 可能无法识别重复键 - 并发场景下,HashMap 不是线程安全的;如需多线程合并,应改用
ConcurrentHashMap并配合相应方法(如compute())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











