Szukałem implementacji map dwukierunkowych w Javie i natknąłem się na te dwie biblioteki:
- Google Guava (dawniej „Kolekcje Google”)
- Kolekcje Apache Commons
Oba są bezpłatne, mają implementację mapy dwukierunkowej, której szukałem (BidiMap w Apache, BiMap w Google), są niesamowicie prawie tego samego rozmiaru (Apache 493 kB, Google 499 kB) [wyd .: już nie prawda!] I wydają się pod każdym względem bardzo podobny do mnie.
Który powinienem wybrać i dlaczego? Czy istnieją inne równoważne alternatywy (muszą być bezpłatne i mieć przynajmniej mapę dwukierunkową)? Pracuję z najnowszą wersją Java SE, więc nie muszę sztucznie ograniczać się do Java 5 lub czegoś podobnego.
java
collections
apache-commons
guava
Joonas Pulakka
źródło
źródło
Odpowiedzi:
Moim zdaniem lepszym wyborem jest Guava (wcześniej znana jako kolekcje Google):
CacheBuilder
a jego poprzednikMapMaker
jest po prostu niesamowityKolekcje Apache Commons są również dobrą biblioteką, ale od dawna nie udostępnia ona wersji generycznej (co jest, moim zdaniem, poważną wadą interfejsu API kolekcji) i ogólnie wydaje się, że jest w utrzymaniu / nie robi Tryb -too-much-on-it Ostatnio Kolekcje Commons ponownie nabrały siły, ale ma jeszcze trochę do nadrobienia. .
Jeśli rozmiar pobierania / rozmiar pamięci / rozmiar kodu jest problemem, to kolekcje Apache Commons mogą być lepszym kandydatem, ponieważ jest to powszechna zależność innych bibliotek. Dlatego też użycie go we własnym kodzie może potencjalnie zostać wykonane bez dodawania jakichkolwiek dodatkowych zależności. Edycja: Ta szczególna „przewaga” została już częściowo osłabiona, ponieważ wiele nowych bibliotek faktycznie zależy od Guawy, a nie od zbiorów Apache Commons.
źródło
Z najczęściej zadawanych pytań: Najczęściej zadawane pytania dotyczące kolekcji Google
źródło
Najważniejsze rzeczy, które znalazłem, które sprawiają, że Kolekcje Google to miejsce, od którego możesz zacząć:
Oto świetny film na Youtube z wykładem, który został wygłoszony przez głównego autora, a on ma świetną robotę, dyskutując o tym, co warto wiedzieć o tej bibliotece.
źródło
Dwie inne rzeczy (mam nadzieję, że się nie mylę)
źródło
git clone https://code.google.com/p/guava-libraries/
igit checkout v11.0.2
?Jedną z nieprzyjemnych rzeczy w Guava jest to, że Multimap nie rozszerza java.util.Map. Jeśli masz własne metody działające na Mapach, nie będą one działać na Guava Multimaps (interfejs Apache MultiMap rozszerza java.util.Map). Jestem pewien, że istnieje jakiś dobry powód, dla którego tak jest, ale jest to również niewygodne.
źródło
Multimap
jakMap
, zawsze jestasMap()
widok.Map
, mając na uwadze, że każde odniesienieV
będzie w rzeczywistościCollection<V>
, myślę, że szybko zrozumiesz, dlaczego nie jest to dobry superinterfaceMultimap<K, V>
.