如何从同步映射将映射条目添加到同步/非同步映射java
问题描述:
如何使用addAll()将映射条目添加到来自同步映射的同步/非同步映射 - Java?如何从同步映射将映射条目添加到同步/非同步映射java
Map<String,String> h = Collections.synchronizedMap(new HashMap<String,String>());
Map<String,String> g = Collections.synchronizedMap(new HashMap<String,String>());
// or even better - Map<String,String> = new HashMap<String,String>();
h.put("kkk","eee");
Set<Map.Entry<String,String>> s = h.entrySet();
Set<Map.Entry<String,String>> ss = g.entrySet();
ss.addAll(s); //causes unsupportedoperationexception for both the synchronized version
// of map g and the unsynchronized, even if this operation is placed
// in a synchronized block (synchronized(h){}, and synchronized(g){})
答
HashMap
的EntrySet
不支持addAll
,句号。同步与它无关。要复制从h到g的所有内容,只需执行g.putAll(h);
。
equals()
为Map.Entry<K,V>
指定的方式表示add
和addAll
业务将无法正常运行的的entrySet。 Map.Entry表示如果它们的键和值都匹配,则两个条目相等。所以你应该可以在已经包含[“Foo”,“Bar”]的entrySet中加入[“Foo”,“Baz”],因为它们根据equals
不同。当然,我们知道这是不可能的,entrySet不能包含这两个,Foo的新映射将不得不替换旧映射。所以这些方法根本不被支持。