2013-10-07 15 views
11

Widzę wiele przykładów na temat multimapy, ale nie rozumiem, dlaczego Google Gauva jest inny?Czym różnią się HashMap od HashMultimap

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

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

Czy oba powyższe zachowania zachowują się tak samo w przypadku przechowywania danych, czy inne?

+0

Przeczytaj ten Guava [Wiki] (https://code.google .com/p/guava-libraries/wiki/NewCollectionTypesExplained # Multimap). – Xaerxess

+4

Twoja pierwsza definicja nie jest odpowiednikiem drugiej. Albo druga powinna być 'Mapą >>" (wątpię, że to jest to, czego potrzebujesz), albo pierwsza powinna być 'Multimap '. –

Odpowiedz

13

A MultiMap<A, B> współpracownicy klucza typu A o wartości typu Collection<B> (stąd nazwa MultiMap)

A Map<A, B> Associates klucza typu A o wartości typu B.

Tak, MultiMap<Integer, Set<String>> może być wyświetlany jako Map<Integer, Collection<Set<String>>. Powinno to być oczywiste po przeczytaniu the api documentation.

+1

to było całkiem proste i dlatego pomocne :) –

12

Różnica polega na tym, że w przypadku drugiej implementacji Core Java należy sprawdzić, czy zestaw istnieje przed wstawieniem. Multimap firmy Guava zaopiekuje się tym za Ciebie.

z rdzeniem Java:

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

Z Guava:

opt.put(key, value); 

Guava dba o inicjalizacji skądinąd nieobecny Zestaw do przechowywania wartości, zajmuje się wszelkimi kwestiami gwintów (np zatrzymuje się dwa wątki od utworzenia nowego zestawu dla tego samego klucza równolegle), a także zapewnia kilka użytecznych metod, które w innym przypadku musiałbyś ręcznie wdrożyć, na przykład uzyskać wszystkie wartości dla wszystkich Set s.

+0

@LouisWasserman: dzięki za edycję :) – Rich

0

Przede wszystkim com.google.common.collect.Multimap nie jest java.util.Map, znajduje się w osobnej hierarchii.

Po drugie, wszystkie operacje z Map<Integer, Set<String>> wymagają interfejsu Multimap, ale będziesz musiał je zaimplementować samodzielnie, podczas gdy HashMultimap oferuje gotowe wdrożenie.

1

Źle zrozumiałeś coś. To nie są nawet w przybliżeniu równoważne:

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

W przykładzie opt4 by zmapować pojedynczy Integer do kolekcji zbiorów pszczół. To jest dokładnie punkt użycia Multimap, nie musisz wyraźnie zajmować się drugim wymiarem. Tak więc w rzeczywistości prawidłowe (odpowiednik) deklaracja będzie:

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

i można uzyskać widok mapy tak:

Map<Integer, Set<String>> mapView = multimap.asMap(); 
Powiązane problemy