2012-03-23 10 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

HashMapEntrySetaddAll、フルストップをサポートしていません。同期はそれとは関係ありません。 hからgまでのすべてをコピーするには、g.putAll(h);を実行してください。

equals()Map.Entry<K,V>に指定された方法は、addaddAllの操作がentrySetに対して正しく動作しないことを意味します。 Map.Entryは、KeyとValueの両方が一致すると、2つのエントリが等しいことを示します。したがって、あなたはequalsによると同じではないので、["Foo"、 "Bar"]が既に含まれているentrySetに["Foo"、 "Baz"]を追加できなければなりません。もちろん、これは不可能であることはわかっていますが、entrySetにはこれらの両方を含めることはできません.Fooの新しいマッピングは古いものを置き換える必要があります。したがって、メソッドは単にサポートされていません。

関連する問題