2012-03-23 12 views
2

So fügen Sie einer synchronisierten/nicht synchronisierten Karte aus einer synchronisierten Karte Karteneinträge hinzu, indem Sie addAll() - Java?Hinzufügen von Karteneinträgen zu einer synchronisierten/nicht synchronisierten Karte aus einer synchronisierten Karte 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){}) 

Antwort

5

HashMap ‚s EntrySet nicht unterstützt addAll, Punkt. Die Synchronisation hat damit nichts zu tun. Um alles von h bis g zu kopieren, tun Sie einfach g.putAll(h);.

Die Art und Weise equals() für Map.Entry<K,V> angegeben ist, bedeutet die add und addAll Operationen nicht richtig für die entrySet verhalten würden. Map.Entry sagt, dass zwei Einträge gleich sind, wenn sowohl der Schlüssel als auch der Wert übereinstimmen. Du solltest also ["Foo", "Baz"] zu einem entrySet hinzufügen können, das bereits ["Foo", "Bar"] enthält, da sie laut equals nicht identisch sind. Natürlich wissen wir, dass dies unmöglich ist, das entrySet konnte nicht beides enthalten, das neue Mapping für Foo müsste das alte ersetzen. Also werden die Methoden einfach nicht unterstützt.

Verwandte Themen