Google Guava vs. Apache Commons [zamknięta]

Szukałem implementacji mapy dwukierunkowej w Javie i natknąłem się na te dwie biblioteki:

Oba są darmowe, mają dwukierunkową implementację map, której szukałem( BidiMap w Apache, BiMap w Google), są zadziwiająco prawie tej samej wielkości (Apache 493 kB, Google 499 kB) [ed.: już nie prawda!] i wydają się pod każdym względem ładne podobne do mnie.

Który wybrać i dlaczego? Czy są jakieś inne równoważne alternatywy (muszą być darmowe i mieć przynajmniej dwukierunkową mapę)? Pracuję z najnowszym Java SE, więc nie ma potrzeby sztucznie ograniczać się do Java 5 lub czegoś podobnego.

Author: Mike B., 2009-09-18

5 answers

Moim zdaniem lepszym wyborem jest Guajawa (dawniej znane jako zbiory Google):

    Jest bardziej nowoczesny (ma generyki)
  • absolutnie spełnia wymagania API kolekcji
  • jest aktywnie utrzymywana
  • CacheBuilder i jego poprzednik MapMaker are just plain awesome

Apache Commons Collections jest również dobrą biblioteką, ale od dawna nie zapewnia wersji obsługującej generyki (która jest major wada dla API kolekcji moim zdaniem) i generalnie wydaje się być w trybie konserwacji/nie-rób-zbyt-dużo-pracy nad nim Ostatnio Commons Collections znów poderwało trochę Steama, ale ma trochę do nadrobienia..

Jeśli rozmiar pobierania/rozmiar footprintu pamięci/rozmiar kodu jest problemem, to Apache Commons Collections może być lepszym kandydatem, ponieważ jest powszechną zależnością od innych bibliotek. Dlatego używanie go również w swoim kodzie może być potencjalnie zrobione bez dodawania dodatkowych zależności. Edit: ta szczególna "przewaga" została już częściowo obalona, ponieważ wiele nowych bibliotek w rzeczywistości zależy od Guava i , a nie od kolekcji Apache Commons.

 174
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 20:30:42

Najważniejsze rzeczy, które znalazłem, które sprawiają, że zbiory Google to miejsce na początek:

  • Generics (Kolekcje bez Generics -- FTL)
  • spójność z frameworkiem kolekcji (Josh Bloch był kluczowym graczem w tym frameworku)
  • poprawność. Ci faceci są rozpaczliwie związani z poprawnym rozwiązywaniem tego problemu; mają coś w rodzaju testów jednostkowych 25K i są związani z poprawnym tworzeniem API.

Oto świetny filmik na Youtube z rozmowy, która został podany przez głównego autora i dobrze radzi sobie z omawianiem tego, co warto wiedzieć o tej bibliotece.

 69
Author: joeslice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-17 13:52:24

Z faq: Google Collections FAQ

Dlaczego Google to wszystko zbudowało, skoro zamiast tego mogło próbować ulepszyć Kolekcje Apache Commons?

Zbiory Apache Commons bardzo wyraźnie nie zaspokajały naszych potrzeb. Informatyka nie używa leków generycznych, co jest dla nas problemem, ponieważ nie lubimy Ostrzeżenia kompilacji z naszego kodu. Był również w " holding wzór " przez długi czas. Widać, że wymagałoby to ładnej major inwestycja od nas, aby go naprawić, dopóki nie byliśmy szczęśliwi, że z niego korzystamy, a w międzyczasie nasza własna biblioteka rozrastała się już organicznie.

Ważną różnicą między biblioteką Apache a naszą jest to, że nasze kolekcje bardzo wiernie przestrzegają umów określonych przez implementowane przez nich interfejsy JDK. Jeśli przeglądasz Apache dokumentacja, znajdziesz niezliczone przykłady naruszeń. Oni zasługują na uznanie za to, że tak wyraźnie je wytykają, ale mimo to odbiegają od standardowe zachowanie kolekcji jest ryzykowne! Musisz uważać co robisz z taką kolekcją; błędy zawsze tylko czekają, aby się wydarzyć.

Nasze kolekcje są w pełni uogólnione i nigdy nie naruszają ich umów (z odizolowanymi wyjątkami, gdzie implementacje JDK mają ustawione silne precedens za dopuszczalne naruszenia). Oznacza to, że możesz zdać jeden z nasze kolekcje do każdej metody, która oczekuje kolekcji i czuć całkiem pewny, że wszystko będzie działać dokładnie tak, jak powinien.

 66
Author: Davide Consonni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 12:27:19

Jedną paskudną rzeczą w Guava jest to, że Multimap nie rozszerza Javy.util.Mapa. Jeśli masz własne metody, które działają na mapach, nie będą działać na Guava Multimaps (interfejs Apache MultiMap rozszerza Javę.util.Mapa). Jestem pewien, że jest jakiś dobry powód, dlaczego tak jest, ale jest to również niewygodne.

 -5
Author: matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-05 10:08:31

Dwie inne rzeczy (mam nadzieję, że się nie mylę)

  • licencja Guava (nowa nazwa dla google collections) to Licencja Apache 2.0, co oznacza: ta sama, co dla projektu Apache Commons
  • nie mogę znaleźć kodu źródłowego Guava w pliku do pobrania (wydaje się, że możliwy jest tylko dostęp do git)
 -6
Author: Olivier Faucheux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-05 13:16:09