In dieser Frage Wie kann ich einen Standardbibliothekscontainer in C ++ 11 effizient auswählen? ist ein praktisches Flussdiagramm für die Auswahl von C ++ - Sammlungen.
Ich dachte, dass dies eine nützliche Ressource für Leute ist, die sich nicht sicher sind, welche Sammlung sie verwenden sollen, deshalb habe ich versucht, ein ähnliches Flussdiagramm für Java zu finden, und konnte dies nicht.
Welche Ressourcen und "Spickzettel" stehen zur Verfügung, um die Auswahl der richtigen Sammlung für die Programmierung in Java zu erleichtern? Woher wissen die Benutzer, welche List-, Set- und Map-Implementierungen sie verwenden sollten?
Antworten:
Da ich kein ähnliches Flussdiagramm finden konnte, habe ich beschlossen, selbst eines zu erstellen.
Dieses Flussdiagramm behandelt nicht Dinge wie synchronisierten Zugriff, Thread-Sicherheit usw. oder die Legacy-Sammlungen, sondern die 3 Standard- Sets , 3 Standard- Karten und 2 Standard- Listen .
Dieses Bild wurde für diese Antwort erstellt und ist unter einer Creative Commons Attribution 4.0 International License lizenziert. Die einfachste Zuordnung besteht darin, entweder auf diese Frage oder auf diese Antwort zu verlinken.
Andere Ressourcen
Die wahrscheinlich nützlichste andere Referenz ist die folgende Seite aus der Orakel-Dokumentation, die jede Sammlung beschreibt .
HashSet vs TreeSet
Es gibt eine ausführliche Diskussion darüber, wann
HashSet
oderTreeSet
hier zu verwenden ist: Hashset vs TreesetArrayList vs LinkedList
Ausführliche Diskussion: Wann wird LinkedList über ArrayList verwendet?
quelle
LinkedList
vsArrayList
Entscheidungen nicht zustimmen . ErstensLinkedList
ist es vorzuziehen , wenn die Liste eine signifikante Größe hat .LinkedList
hat einen Overhead pro Element, daher ist er in Bezug auf den Speicherverbrauch asymptotisch schlechter als einArrayList
. Wenn sich der größte Teil des Zugriffs am Ende der Liste befindet,ArrayList
ist ein vorzuziehen, da er einen zeitlich konstanten zufälligen Elementzugriff ermöglicht. Der Zugriff auf dasn
th-Element von aLinkedList
ist eineO(n)
Operation. ... Tatsächlich sollte die Entscheidung, eine verknüpfte Liste zu verwenden, so gut wie immer "Nein" sein.LinkedList
ist jedoch eine doppelt verknüpfte Liste, sodass der Zugriff am Anfang und am Ende schnell erfolgt. Sie werden feststellen, dass von den Zweigen vor allem drei Fragen mit Ja beantwortet werden müssen, bevor ich die Verwendung von empfehlen würde. MitLinkedList
anderen Worten, ich stimme Ihnen zu, dass die Antwort in den meisten Fällen Nein lautet. Dinge wie Warteschlangen und Warteschlangen, bei denen Sie ständig Dinge an den Enden des Listenbereichs hinzufügen und entfernen, sind ein guter Anwendungsfall fürLinkedList
.LinkedList
mehr Speicherplatz pro Element ...ArrayList
niemals Speicher freigegeben wird . Das heißt, wenn Sie eine Liste haben, die manchmal sehr groß wird, aber normalerweise klein ist, führt dies zu einerArrayList
schlechteren Speicherleistung. Der Speicheraufwand für sichList
selbst ist normalerweise (wenn auch nicht immer) gering im Vergleich zu dem der Elemente, die er ebenfalls enthält.Map<K,V>
ist nicht der Teil vonjava.util.collection
Zusammenfassung der wichtigsten nicht gleichzeitigen, nicht synchronisierten Sammlungen
Collection
: Eine Schnittstelle, die eine ungeordnete "Tasche" von Elementen darstellt, die als "Elemente" bezeichnet wird. Das "nächste" Element ist undefiniert (zufällig).Set
: Eine Schnittstelle, die aCollection
ohne Duplikate darstellt.HashSet
: ASet
unterstützt von aHashtable
. Schnellste und kleinste Speichernutzung, wenn die Bestellung unwichtig ist.LinkedHashSet
: AHashSet
mit dem Hinzufügen einer verknüpften Liste, um Elemente in Einfügereihenfolge zuzuordnen . Das "nächste" Element ist das zuletzt eingefügte Element.TreeSet
: ASet
wo Elemente nach a geordnet sindComparator
(normalerweise natürliche Reihenfolge ). Langsamste und größte Speichernutzung, jedoch für komparatorbasierte Bestellungen erforderlich.EnumSet
: Eine extrem schnelle und effizienteSet
Anpassung an einen einzelnen Aufzählungstyp.List
: Eine Schnittstelle, die a darstellt,Collection
deren Elemente geordnet sind und deren numerischer Index jeweils ihre Position darstellt, wobei Null das erste und(length - 1)
das letzte Element ist.ArrayList
: EinList
von einem Array unterstütztes Array, bei dem das Array eine Länge ("Kapazität" genannt) hat, die mindestens so groß ist wie die Anzahl der Elemente (die "Größe" der Liste). Wenn die Größe die Kapazität überschreitet (wenn das(capacity + 1)-th
Element hinzugefügt wird), wird das Array mit einer neuen Kapazität von neu erstellt.(new length * 1.5)
Diese Neuerstellung ist schnell, da sie verwendet wirdSystem.arrayCopy()
. Zum Löschen und Einfügen / Hinzufügen von Elementen müssen alle benachbarten Elemente (rechts) in diesen Bereich oder aus diesem heraus verschoben werden. Der Zugriff auf ein Element ist schnell, da nur die Berechnung erforderlich ist(element-zero-address + desired-index * element-size)
, um seinen Standort zu ermitteln. In den meisten Fällen , eineArrayList
über eine bevorzugtLinkedList
.LinkedList
: A wirdList
von einer Reihe von Objekten unterstützt, die jeweils mit ihren "vorherigen" und "nächsten" Nachbarn verknüpft sind. ALinkedList
ist auch einQueue
undDeque
. Der Zugriff auf Elemente erfolgt ab dem ersten oder letzten Element und wird durchlaufen, bis der gewünschte Index erreicht ist. Das Einfügen und Löschen, sobald der gewünschte Index durch Traversal erreicht ist, ist eine triviale Angelegenheit, bei der nur die Links zum unmittelbaren Nachbarn neu zugeordnet werden, um auf das neue Element zu verweisen oder das jetzt gelöschte Element zu umgehen.Map
: Eine Schnittstelle, die darstellt,Collection
wo jedes Element einen identifizierenden "Schlüssel" hat - jedes Element ist ein Schlüssel-Wert-Paar.HashMap
: AMap
wo Schlüssel ungeordnet sind und von a unterstützt werdenHashtable
.LinkedhashMap
: Die Schlüssel werden nach Einfügereihenfolge sortiert .TreeMap
: AMap
wo Schlüssel nach a geordnet sindComparator
(normalerweise natürliche Reihenfolge).Queue
: Eine Schnittstelle, die darstellt,Collection
wo Elemente normalerweise an einem Ende hinzugefügt und vom anderen entfernt werden (FIFO: First-In, First-Out).Stack
: Eine Schnittstelle, die darstellt,Collection
wo Elemente normalerweise am selben Ende hinzugefügt (verschoben) und entfernt (gepoppt) werden (LIFO: last-in, first-out).Deque
: Abkürzung für "Double Ended Queue", normalerweise ausgesprochen "Deck". Eine verknüpfte Liste, die normalerweise nur zu beiden Enden hinzugefügt und von diesen gelesen wird (nicht von der Mitte).Grundlegende Sammlungsdiagramme:
Vergleichen der Einfügung eines Elements mit einem
ArrayList
undLinkedList
:quelle
Ein noch einfacheres Bild ist hier. Absichtlich vereinfacht!
Sammlung ist alles, was Daten enthält, die als "Elemente" (vom gleichen Typ) bezeichnet werden. Es wird nichts Spezifischeres angenommen.
Liste ist eine indizierte Sammlung von Daten, bei der jedes Element einen Index hat. So etwas wie das Array, aber flexibler.
Die Daten in der Liste behalten die Einfügereihenfolge bei.
Typische Operation: Holen Sie sich das n-te Element.
Set ist eine Tüte mit Elementen , jedes Element nur einmal (die Elemente werden anhand ihrer
equals()
Methode unterschieden.Die Daten im Set werden meistens nur gespeichert, um zu wissen, welche Daten vorhanden sind.
Typische Operation: Stellen Sie fest, ob ein Element in der Liste vorhanden ist.
Map ist so etwas wie die Liste, aber anstatt über ihren ganzzahligen Index auf die Elemente zuzugreifen, greifen Sie über ihren Schlüssel , der ein beliebiges Objekt ist, auf sie zu. Wie das Array in PHP :)
Daten in der Karte können anhand ihres Schlüssels durchsucht werden.
Typische Operation: Holen Sie sich ein Element anhand seiner ID (wobei ID von einem beliebigen Typ ist, nicht nur
int
wie im Fall von List).Die Unterschiede
Set und Map: In Set suchen Sie Daten selbst , während Sie in Map nach ihrem Schlüssel suchen .
Liste und Karte: In Liste greifen Sie über ihren
int
Index (Position in Liste) auf das Element zu , während Sie in Karte über ihren Schlüssel auf ein beliebiges Betriebssystem zugreifen (normalerweise: ID).Liste und Menge: In Liste sind die Elemente an ihre Position gebunden und können dupliziert werden, während in Menge die Elemente nur "vorhanden" (pr nicht vorhanden) und eindeutig (im Sinne von
equals()
odercompareTo()
fürSortedSet
) sind.quelle
Es ist ganz einfach: Wenn Sie Werte mit zugeordneten Schlüsseln speichern müssen, wählen Sie die Map-Oberfläche. Andernfalls verwenden Sie List für Werte, die möglicherweise dupliziert werden, und verwenden Sie schließlich die Set-Schnittstelle, wenn Sie keine doppelten Werte in Ihrer Sammlung haben möchten.
Hier ist die vollständige Erklärung http://javatutorial.net/choose-the-right-java-collection , einschließlich Flussdiagramm usw.
quelle
Karte
Bei Auswahl von a habe
Map
ich diese Tabelle erstellt, in der die Funktionen jeder der zehn mit Java 11 gebündelten Implementierungen zusammengefasst sind.quelle
Gemeinsame Sammlungen, Gemeinsame Sammlungen
quelle
Welche Java Collection soll ich verwenden?
Es hängt davon ab, welches Problem Sie lösen möchten oder welche Anforderungen Sie haben.
Beispiele:
quelle