web-dev-qa-db-fra.com

Quelle est la différence entre HashMap et HashMultimap

Je vois de nombreux exemples de multimap mais je ne comprends pas pourquoi Google Guava est différent?

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

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

Les deux ci-dessus se comportent-ils de la même manière pour la conservation des données ou sont-ils différents?

18
Faisal Basra

UNE MultiMap<A, B> associe une clé de type A à une valeur de type Collection<B> (d'où le nom MultiMap)

UNE Map<A, B> associe une clé de type A à une valeur de type B.

Donc, un MultiMap<Integer, Set<String>> peut être considéré comme un Map<Integer, Collection<Set<String>>. Cela devrait être évident en lisant la documentation de l'API .

26
JB Nizet

La différence est qu'avec la seconde, Core Java, vous devez vérifier si le Set est là avant de l'insérer. Le Multimap de Guava s'en charge pour vous.

Avec Core Java:

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

Avec la goyave:

opt.put(key, value);

La goyave prend soin d'initialiser un ensemble autrement absent pour stocker les valeurs, s'occupe de tout problème de thread (par exemple, empêche deux threads de créer un nouvel ensemble pour la même clé en parallèle) et fournit également quelques méthodes utiles dont vous auriez autrement besoin. à implémenter à la main, par exemple en obtenant toutes les valeurs sur tous les Sets.

15
Rich

Vous avez mal compris quelque chose. Ce ne sont même pas à peu près équivalents:

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

Dans votre exemple, opt4 mapperait un seul Integer à une collection d'ensembles de chaînes. C'est exactement le point d'utiliser un Multimap, vous n'avez pas à traiter explicitement la deuxième dimension. Donc, en fait, la déclaration correcte (équivalente) serait:

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

et vous pouvez obtenir une vue de la carte comme celle-ci:

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

Non, MultiMap signifie qu'il y aurait une collection d'objets attachés à chaque clé. Documentation: Multimap_Is_Not_A_Map

3
Admit

Tout d'abord, com.google.common.collect.Multimap n'est pas Java.util.Map, il est dans une hiérarchie distincte.

Deuxièmement, vous pouvez effectuer toutes les opérations avec Map<Integer, Set<String>> que l'interface Multimap nécessite mais vous devrez les implémenter vous-même tandis que HashMultimap offre une implémentation prête.

0
Evgeniy Dorofeev