Как добавить записи карты в синхронизированную / несинхронизированную карту из синхронизированной карты Java - PullRequest
2 голосов
/ 24 марта 2012

Как добавить записи на синхронизированную / несинхронизированную карту с синхронизированной карты, используя 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 Ответ

5 голосов
/ 24 марта 2012

HashMap EntrySet не поддерживает addAll, полный останов.Синхронизация не имеет к этому никакого отношения.Чтобы скопировать все из h в g, просто выполните g.putAll(h);.

. Для Map.Entry<K,V> указан способ equals(), означающий, что операции add и addAll не будут работать должным образом для entrySet.Map.Entry говорит, что две записи равны, если их ключ и значение совпадают.Таким образом, вы должны иметь возможность добавить ["Foo", "Baz"] в набор записей, который уже содержит ["Foo", "Bar"], поскольку они не совпадают в соответствии с equals.Конечно, мы знаем, что это невозможно, entrySet не может содержать их обоих, новое отображение для Foo должно заменить старое.Так что методы просто не поддерживаются.

...