Google Guava vs. Apache Commons [geschlossen]

212

Ich suchte nach einer bidirektionalen Kartenimplementierung in Java und stieß auf diese beiden Bibliotheken:

Beide sind kostenlos, haben die von mir gesuchte bidirektionale Kartenimplementierung (BidiMap in Apache, BiMap in Google), sind erstaunlich fast gleich groß (Apache 493 kB, Google 499 kB) [Hrsg.: Nicht mehr wahr!] Und scheinen in jeder Hinsicht ziemlich ähnlich zu mir.

Welches soll ich wählen und warum? Gibt es andere gleichwertige Alternativen (muss kostenlos sein und mindestens die bidirektionale Karte haben)? Ich arbeite mit der neuesten Java SE, daher muss ich mich nicht künstlich auf Java 5 oder ähnliches beschränken.

Joonas Pulakka
quelle
5
Sicherlich sollten Sie uns die Kriterien für die Auswahl der Bibliothek geben? Lizenz, Leistung, zusätzliche Abhängigkeiten, unterstützende Generika, ...
SteveD
1
Google Collections ist verfügbar auf repo1.maven.org: repo1.maven.org/maven2/com/google/collections/…
Joachim Sauer
Ich stehe korrigiert - ich habe in com / googlecode gesucht
kdgregory

Antworten:

185

Meiner Meinung nach ist Guava (früher bekannt als Google-Sammlungen) die bessere Wahl :

  • es ist moderner (hat Generika)
  • Es folgt absolut den Anforderungen der Sammlungs-API
  • es wird aktiv gepflegt
  • CacheBuilderund sein Vorgänger MapMakersind einfach fantastisch

Apache Commons Collections ist ebenfalls eine gute Bibliothek, hat jedoch lange Zeit keine generika-fähige Version bereitgestellt (was meiner Meinung nach ein großer Nachteil für eine Sammlungs-API ist) und scheint sich im Allgemeinen in einer Wartungs- / Nicht-Do-Funktion zu befinden -zu-viel-Arbeit-an-es-Modus In letzter Zeit hat Commons Collections wieder etwas Fahrt aufgenommen , aber es gibt Nachholbedarf. .

Wenn Downloadgröße / Speicherbedarf / Codegröße ein Problem darstellt, sind Apache Commons Collections möglicherweise ein besserer Kandidat, da dies eine häufige Abhängigkeit von anderen Bibliotheken ist. Daher kann die Verwendung in Ihrem eigenen Code möglicherweise auch ohne Hinzufügen zusätzlicher Abhängigkeiten erfolgen. Bearbeiten: Dieser besondere "Vorteil" wurde inzwischen teilweise untergraben, da viele neue Bibliotheken tatsächlich von Guava und nicht von Apache Commons-Sammlungen abhängen .

Joachim Sauer
quelle
3
Was ich mich wirklich frage: Warum gibt es keine anderen Meinungen? Soll ich den Devils Advocate spielen? Apache Commons Collections ist schließlich keine schlechte Bibliothek.
Joachim Sauer
10
Da dem Apache Generika fehlen, denke ich, dass es offensichtlich ist, welche dieser beiden die Zukunft ist. Google ist der nächste logische Schritt nach vorne. Es ist jedoch ein seltsames Gefühl, dass es von The Giant erstellt wurde ... aber solange es unter einer kostenlosen Lizenz steht, sollte es keine Rolle spielen, selbst wenn es von Microsoft erstellt wurde. Ich vermute.
Joonas Pulakka
12
Leser sollten sich bewusst sein, dass dies eine sehr alte Antwort ist und sich viel geändert hat
Roy Truelove
1
@ RoyTruelove Es überrascht mich nicht, dass sich viel geändert hat und ich würde gerne Ihre aktuellen Gedanken zu diesem Thema oder vielleicht einen Link zu einer neueren Bewertung / einem neueren Vergleich hören. Ich mag die Philosophie "Standardmäßig unveränderlich / nur bei Bedarf veränderbar" und die Einbeziehung von Generika in die Guave, aber die Materialien, die ich gelesen habe, sind möglicherweise alle so datiert, wie Sie sagen, dass dieser Thread geworden ist.
JoeA
2
@ testerjoe2 - Entschuldigung, ich habe diesen Kommentar vor langer Zeit geschrieben und erinnere mich ehrlich gesagt nicht an den Grund dafür. Im Nachhinein war es ziemlich wenig hilfreich! Ich wusste nicht, dass sich die Bibliotheken seit 2010 nicht geändert haben, aber ich weiß, dass sie weiterhin stark genutzt werden, und deshalb würde ich sagen, dass sie sicher sein sollten. Wenn ich heute mit einem neuen Projekt anfangen würde, würde ich mir wahrscheinlich die Sammlung von Goldman Sach genauer ansehen: github.com/goldmansachs/gs-collections . Wenn Sie eines der bösesten Unternehmen der Welt sind, sollten Sie wirklich sicherstellen, dass Sie eine Kickass-Java-Sammlungsbibliothek haben.
Roy Truelove
72

Aus der FAQ : Google Collections FAQ

Warum hat Google all dies erstellt, obwohl es stattdessen hätte versuchen können, die Apache Commons-Sammlungen zu verbessern?

Die Apache Commons-Sammlungen entsprachen eindeutig nicht unseren Anforderungen. Es werden keine Generika verwendet, was für uns ein Problem darstellt, da wir es hassen, Kompilierungswarnungen aus unserem Code zu erhalten. Es ist auch seit langer Zeit in einem "Warteschleifenmuster". Wir konnten sehen, dass es eine ziemlich große Investition von uns erfordern würde, um es zu reparieren, bis wir es gerne nutzen würden, und in der Zwischenzeit wuchs unsere eigene Bibliothek bereits organisch.

Ein wichtiger Unterschied zwischen der Apache-Bibliothek und unserer besteht darin, dass unsere Sammlungen die Verträge, die in den von ihnen implementierten JDK-Schnittstellen angegeben sind, sehr genau einhalten. Wenn Sie die Apache-Dokumentation lesen, finden Sie unzählige Beispiele für Verstöße. Sie verdienen Anerkennung dafür, dass sie so deutlich darauf hingewiesen haben, aber dennoch ist es riskant, vom Standard-Sammelverhalten abzuweichen! Sie müssen vorsichtig sein, was Sie mit einer solchen Sammlung machen; Bugs warten immer nur darauf, passiert zu werden.

Unsere Sammlungen werden vollständig generiert und verstoßen niemals gegen ihre Verträge (mit vereinzelten Ausnahmen, bei denen JDK-Implementierungen einen starken Präzedenzfall für akzeptable Verstöße darstellen). Dies bedeutet, dass Sie eine unserer Sammlungen an jede Methode übergeben können, die eine Sammlung erwartet, und sich ziemlich sicher sind, dass die Dinge genau so funktionieren, wie sie sollten.

Davide Consonni
quelle
71

Die wichtigsten Dinge, die ich gefunden habe, machen Google Collections zum Ausgangspunkt:

  • Generika (Sammlungen ohne Generika - FTL)
  • Übereinstimmung mit dem Sammlungsrahmen (Josh Bloch war ein Schlüsselspieler in diesem Rahmen)
  • Richtigkeit. Diese Jungs sind verzweifelt daran gebunden, dieses Problem richtig zu machen. Sie haben so etwas wie 25K-Unit-Tests und sind daran gebunden, die API genau richtig zu machen.

Hier ist ein großartiges Youtube-Video eines Vortrags, der vom Hauptautor gehalten wurde, und er diskutiert gut, was es wert ist, über diese Bibliothek informiert zu werden.

joeslice
quelle
7
+1 für den Videolink
Jesper
1
Tolle weitere Informationen zu Google Collections: javalobby.org/articles/google-collections (ein Interview mit den Hauptentwicklern). Suchen Sie nach der Frage "Was ist einzigartig an Ihrem Ansatz? Wie unterscheidet er sich beispielsweise von der Apache Commons Collection?"
Jonik
4
Apache Commons Collections Version 4 verwendet Generika. commons.apache.org/proper/commons-collections/release_4_0.html
Abdull
-7

Zwei andere Dinge (ich hoffe ich liege nicht falsch)

  • Die Lizenz von Guava (neuer Name für Google-Sammlungen) ist die Apache-Lizenz 2.0, dh: dieselbe wie für das Apache Commons-Projekt
  • Ich kann den Quellcode von Guava nicht in einer Datei zum Herunterladen finden (anscheinend ist nur ein Git-Zugriff möglich).
Olivier Faucheux
quelle
19
Quellen? Du meinst Glas, das in Eclipse angehängt werden kann? Es ist hier . Übrigens: Was ist los mit git clone https://code.google.com/p/guava-libraries/und git checkout v11.0.2?
Xaerxess
-7

Eine böse Sache an Guava ist, dass Multimap java.util.Map nicht erweitert. Wenn Sie über eigene Methoden verfügen, die mit Maps funktionieren, funktionieren diese nicht mit Guava Multimaps (die Apache MultiMap-Oberfläche erweitert java.util.Map). Ich bin mir sicher, dass es einen guten Grund gibt, warum es so ist, aber es ist auch unpraktisch.

matt
quelle
16
Wenn Sie Multimaplike verwenden möchten Map, gibt es immer asMap()Ansicht.
Xaerxess
22
Wie soll eine Multimap java.util.Map implementieren? Eine Multi-Map unterscheidet sich grundlegend von einer Map.
Sleske
1
Multimap <K, V> erweitert Map <K, Collection <V >>. Ich vermute, G hatte gute Gründe, Map nicht als Superinterface zu verwenden.
Matt
10
@lucek: Wenn Sie im Javadoc nachsehen Map, mit dem Verständnis, dass jeder Verweis auf Vtatsächlich ein sein wird Collection<V>, werden Sie ziemlich schnell erkennen, warum es kein gutes Superinterface für ist Multimap<K, V>.
Ruakh