如何把所有的Java哈希映射的内容都放到另一个,但不能replace现有的键和值?

我需要将所有键和值从一个HashMap复制到另一个B,但不能replace现有的键和值。

最好的办法是做什么?

我在想,而不是迭代keySet,并检查它是否存在,我会的

Map temp = new HashMap(); // generic later temp.putAll(Amap); A.clear(); A.putAll(Bmap); A.putAll(temp); 

看起来你愿意创build一个临时Map ,所以我会这样做:

 Map tmp = new HashMap(patch); tmp.keySet().removeAll(target.keySet()); target.putAll(tmp); 

在这里, patch是您要添加到target地图的地图。

感谢Louis Wasserman,这是一个利用Java 8中新方法的版本:

 patch.forEach(target::putIfAbsent); 

使用Guava的Maps类的效用方法来计算2个地图的差异,你可以用一行代码来完成,使用一个方法签名使得它更加清楚你想要完成什么:

 public static void main(final String[] args) { // Create some maps final Map<Integer, String> map1 = new HashMap<Integer, String>(); map1.put(1, "Hello"); map1.put(2, "There"); final Map<Integer, String> map2 = new HashMap<Integer, String>(); map2.put(2, "There"); map2.put(3, "is"); map2.put(4, "a"); map2.put(5, "bird"); // Add everything in map1 not in map2 to map2 map2.putAll(Maps.difference(map1, map2).entriesOnlyOnLeft()); } 

只需迭代并添加:

 for(Map.Entry e : a.entrySet()) if(!b.containsKey(e.getKey()) b.put(e.getKey(), e.getValue()); 

编辑添加:

如果你可以修改一个,你也可以这样做:

 a.putAll(b) 

和一个将有你所需要的。 ( b所有条目和b所有条目都不在b

用Java 8有这个API方法来完成你的要求。

 map.putIfAbsent(key, value) 

如果指定键尚未与值关联(或映射为null),则将其与给定值关联并返回null,否则返回当前值。

如果您在@ erickson的解决scheme中更改地图顺序,您可以只用1行:

 mapWithNotSoImportantValues.putAll( mapWithImportantValues ); 

在这种情况下,使用相同的键将mapWithNotSoImportantValues中的值replace为mapWithImportantValues中的值。

 public class MyMap { public static void main(String[] args) { Map<String, String> map1 = new HashMap<String, String>(); map1.put("key1", "value1"); map1.put("key2", "value2"); map1.put("key3", "value3"); map1.put(null, null); Map<String, String> map2 = new HashMap<String, String>(); map2.put("key4", "value4"); map2.put("key5", "value5"); map2.put("key6", "value6"); map2.put("key3", "replaced-value-of-key3-in-map2"); // used only if map1 can be changes/updates with the same keys present in map2. map1.putAll(map2); // use below if you are not supposed to modify the map1. for (Map.Entry e : map2.entrySet()) if (!map1.containsKey(e.getKey())) map1.put(e.getKey().toString(), e.getValue().toString()); System.out.println(map1); }}