В чем разница между 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 заботится об инициализации в противном случае отсутствующего набора для хранения значений, заботится о любых проблемах с потоками (например, останавливает два потока от создания нового набора для одного и того же ключа параллельно), а также предоставляет несколько полезные методы, которые в противном случае необходимо реализовать вручную, такие как получение всех значений по всем Set
s.
Неа, 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 предлагает готовую реализацию.