2012-03-23 85 views
2

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

回答

5

HashMapEntrySet不支持addAll,句號。同步與它無關。要複製從h到g的所有內容,只需執行g.putAll(h);

equals()Map.Entry<K,V>指定的方式表示addaddAll業務將無法正常運行的的entrySet。 Map.Entry表示如果它們的鍵和值都匹配,則兩個條目相等。所以你應該可以在已經包含[「Foo」,「Bar」]的entrySet中加入[「Foo」,「Baz」],因爲它們根據equals不同。當然,我們知道這是不可能的,entrySet不能包含這兩個,Foo的新映射將不得不替換舊映射。所以這些方法根本不被支持。