Java collection einfügen: Set vs. Liste
Ich denke über die Besetzung einer Sammlung mit einer großen Anzahl von einzigartigen Objekten.
Wie wird der Preis von einem Einsatz in einer Reihe (z.B. HashSet) im Vergleich zu einer Liste (z.B. ArrayList)?
Mein Gefühl ist, dass duplicate elimination in Gruppen kann es zu leichten overhead.
- Wenn Sie bereits einige Mechanismen, die die Eindeutigkeit sicherstellt, warum die Mühe mit dem einstellen? Wenn Sie nicht und Sie brauchen, um zu garantieren Einzigartigkeit, dann eine Liste ist definitiv nicht das, was Sie wollen.
InformationsquelleAutor Will | 2011-05-18
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt keine Duplikat-elimination", wie Sie im Vergleich zu allen vorhandenen Elementen an. Wenn Sie die insert into-hash-set, es ist wirklich ein Wörterbuch der Gegenstände durch den hash-code. Es gibt keine doppelten überprüfung, es sei denn, es gibt bereits Elemente mit dem gleichen hash-code. Eine angemessene (gut verteilt) - hash-Funktion, ist es nicht so schlimm.
Als Wird bemerkt hat, weil der dictionary-Struktur
HashSet
ist wahrscheinlich ein bisschen langsamer als eineArrayList
(es sei denn, Sie wollen einfügen "zwischen" vorhandenen Elemente). Es ist auch ein bisschen größer. Ich bin mir nicht sicher, das ist ein wesentlicher Unterschied.hashCode
).Du hast Recht: Satz-Strukturen sind von Natur aus Komplex, um zu erkennen und entfernen von Duplikaten. Ob dieser Aufwand ist maßgeblich für Ihren Fall sollte getestet werden mit einem benchmark.
Ein weiterer Faktor ist die Speicherauslastung. Wenn Sie Ihre Objekte sind sehr klein, der Speicher-overhead eingeführt durch die festgelegte Struktur kann erheblich sein. Im extremsten Fall (
TreeSet<Integer>
vs.ArrayList<Integer>
) die set-Struktur kann verlangen, mehr als 10 mal so viel Speicher.Wenn Sie bestimmte Ihre Daten eindeutig sein, verwenden Sie eine Liste aus. Sie können ein Set zu durchzusetzen diese Regel.
Die Sätze sind schneller als Listen wenn Sie eine große Datenmenge, während die umgekehrte ist wahr für kleinere Datenmengen. Ich habe nicht persönlich getestet, diesen geltend zu machen.
, Welche Art von Liste?
Überlegen Sie auch, welche Liste zu verwenden. LinkedLists sind schneller beim hinzufügen oder löschen von Elementen.
ArrayLists sind schneller im random access (
for
Schleifen, etc), dies kann aber umgangen werden mit derIterator
einer LinkedList. ArrayLists sind viel schneller an:list.toArray()
.add()
und iterationWenn das Ziel ist, die Einzigartigkeit der Elemente, die Sie verwenden sollten, eine Umsetzung der java.util.Set - Schnittstelle. Die Klasse java.util.HashSet und java.util.LinkedHashSet O(alpha) (in der Nähe der O(1) in der best-case -) Komplexität für einfügen, löschen und enthält überprüfen.
ArrayList
O(n) für das Objekt (nicht index) enthält, überprüfen (Sie müssen scrollen durch die gesamte Liste) und einfügen (wenn die Einfügemarke nicht in den Schwanz der Liste, die Sie haben, verschieben Sie das ganze unterstreichen array).Können Sie
LinkedHashSet
, dass die Erhaltung der Reihenfolge von Einfüge-und haben die gleiche Potenz derHashSet
(nimmt nur ein wenig mehr Speicher).Vergleicht man konkrete Implementierungen (zum Beispiel
HashSet
mitArrayList
), weil die abstrakte SchnittstellenSet
/List
sagen Ihnen nicht wirklich etwas über die Leistung.Einfügen in eine
HashSet
ist ein ziemlich Billig Betrieb, solange diehashCode()
der das Objekt eingefügt werden soll, ist gesund. Es wird immer noch etwas langsamer alsArrayList
, weil es einsetzen ist ein einfaches einsetzen in ein array (vorausgesetzt, Sie legen am Ende und es gibt noch Platz, ich weiß nicht Faktor in der Größe des internen Arrays, da die gleichen Kosten giltHashSet
auch).Ich glaube nicht, dass Sie machen können dieses Urteil einfach auf die Kosten für den Aufbau der Sammlung. Andere Dinge, die Sie berücksichtigen müssen, sind:
Diese können alle Einfluss auf Ihre Wahl der Datenstruktur.
Java-Liste:
Wenn Sie keine solche Anforderung, die Sie haben, um doppelte oder nicht. Dann können Sie die Liste anstelle von Set.
Liste ist eine Schnittstelle Collection framework. Erstreckt sich die Collection-Schnittstelle. und ArrayList, LinkedList ist die Implementierung der List-Schnittstelle.
Wann ArrayList oder LinkedList
ArrayList: Wenn Sie eine solche Anforderung, die sich in Ihrer Anwendung meist auf die Daten zugreift. Dann sollten Sie gehen für die ArrayList. da ArrayList implementiert RtandomAccess Schnittstelle, die Marker-Interface. da der Marker-interface ArrayList haben die Fähigkeit, Zugriff auf die Daten in O(1) Zeit. und Sie können ArrayList über LinkedList, wo Sie wollen, um Daten nach der insertion um.
LinkedList: Wenn Sie eine solche Anforderung, dass Ihr meistens arbeiten ist, einfügen oder löschen. Dann sollten Sie LinkedList über die ArrayList. weil in LinkedList einfügen und löschen geschieht in O(1) Zeit, in der Erwägung, dass in der ArrayList-es ist O(n) Zeit.
Java Set:
Wenn Sie haben Anspruch in Ihrem Antrag, dass Sie nicht möchten, dass alle Duplikate. Dann sollten Sie, anstatt der Liste. Da Set speichert keine Duplikate. Da arbeiten auf dem Prinzip der Vermischung. Wenn wir hinzufügen, Objekt im Satz dann zunächst prüft Objekt die hashCode in die Eimer, wenn es jeder finden hashCode in ihm gegenwärtig ist, buckelte dann werde es nicht hinzufügen, dass Objekt.