В чем разница между HashMap и HashMultimap

Я вижу много примеров о multimap, но не понял, почему Google Gauva отличается?

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva

Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

оба выше ведут себя одинаково для хранения данных или разные?

5 ответов


A MultiMap<A, B> связывает ключ типа A со значением типа Collection<B> (отсюда и название MultiMap)

A Map<A, B> связывает ключ типа A со значением типа B.

Итак, a MultiMap<Integer, Set<String>> можно рассматривать как Map<Integer, Collection<Set<String>>. Это должно быть очевидно, прочитав документация по api.


разница в том, что со второй, основной реализацией Java, вам нужно проверить, есть ли набор, прежде чем вставлять. Multimap гуавы позаботится об этом для вас.

С Ядром Java:

Set<String> innerSet = opt.get(key);
if (innerSet == null) {
    innerSet = new HashSet<String>();
    opt.put(key, innerSet);
}
innerSet.add(value);

С Гуавой:

opt.put(key, value);

Guava заботится об инициализации в противном случае отсутствующего набора для хранения значений, заботится о любых проблемах с потоками (например, останавливает два потока от создания нового набора для одного и того же ключа параллельно), а также предоставляет несколько полезные методы, которые в противном случае необходимо реализовать вручную, такие как получение всех значений по всем Sets.


Неа, MultiMap означает, что к каждому ключу будет прикреплена коллекция объектов. Документация: Multimap_Is_Not_A_Map


вы что-то неправильно поняли. Они даже приблизительно не эквивалентны:

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Guava
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java

в вашем примере opt4 будет отображать один Integer в коллекцию наборов строк. Именно с помощью Multimap, вам не нужно явно иметь дело со вторым измерением. Таким образом, на самом деле правильным (эквивалентным) объявлением было бы:

SetMultimap<Integer, String> multimap = HashMultimap.create(); // Guava

и вы можете получить карту, как это:

Map<Integer, Set<String>> mapView = multimap.asMap();

прежде всего com.гуглить.общий.собирать.Multimap не является java.утиль.Карта, она находится в отдельной иерархии.

во-вторых, вы можете все операции с Map<Integer, Set<String>> этот интерфейс Multimap требует, но вам придется реализовать их самостоятельно, в то время как HashMultimap предлагает готовую реализацию.