如何将映射条目从同步映射java添加到同步/非同步映射

时间:2012-03-23 22:34:55

标签: java collections map

如何使用addAll() - 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){})

1 个答案:

答案 0 :(得分:5)

HashMap的{​​{1}}不支持EntrySet,完全停止。同步与它无关。要复制从h到g的所有内容,只需执行addAll

g.putAll(h);指定equals()的方式意味着Map.Entry<K,V>add操作对于entrySet的行为不正确。 Map.Entry表示如果Key和Value都匹配,则两个条目相等。所以你应该能够将[“Foo”,“Baz”]添加到已经包含[“Foo”,“Bar”]的entrySet中,因为根据addAll它们不一样。当然我们知道这是不可能的,entrySet不能包含这两者,Foo的新映射必须替换旧的映射。所以这些方法根本不受支持。

相关问题