Angenommen, Sie müssen Elemente in Collection
speichern / abrufen, sich nicht um die Reihenfolge kümmern, und Duplikate sind zulässig, welche Art von Collection
verwenden Sie?
Standardmäßig habe ich immer ArrayList
verwendet, aber ich erinnere mich, irgendwo gelesen / gehört zu haben, dass eine Queue
-Implementierung eine bessere Wahl ist. A List
ermöglicht das Hinzufügen / Abrufen / Entfernen von Elementen an beliebigen Positionen, was zu einer Leistungseinbuße führt. Da Queue
diese Möglichkeit nicht bietet, sollte sie theoretisch schneller sein, wenn diese Einrichtung nicht benötigt wird.
Mir ist klar, dass alle Diskussionen über die Leistung etwas bedeutungslos sind, das einzige, was wirklich zählt, ist die Messung. Dennoch bin ich daran interessiert zu wissen, was andere für ein Collection
verwenden, wenn sie sich nicht um das Ordnen kümmern und Duplikate erlaubt sind, und warum ?
"Es kommt darauf an". Die Frage, die Sie wirklich zuerst beantworten müssen, lautet: "Wofür möchte ich die Sammlung verwenden?"
Wenn Sie häufig Elemente an einem der Enden (Anfang, Ende) einfügen / entfernen, ist Queue
besser als% ArrayList
. In vielen Fällen erstellen Sie jedoch eine Sammlung, um nur daraus zu lesen. In diesem Fall ist eine ArrayList weitaus effizienter: Da sie als Array implementiert ist, können Sie sehr effizient iterieren (dasselbe gilt für LinkedList
). Eine LinkedList verwendet jedoch Verweise, um einzelne Elemente miteinander zu verknüpfen. Wenn Sie also kein zufälliges Entfernen von Elementen benötigen (in der Mitte), ist ArrayList
besser: Ein ArrayList
benötigt weniger Speicher, da die Elemente nicht den Speicher für den Verweis auf das nächste / vorherige Element benötigen.
Um es zusammenzufassen:
ArrayList
= gut, wenn Sie einmal einfügen und oft lesen (wahlfreier Zugriff oder sequenziell)
LinkedList
= gut, wenn Sie häufig zufällige Positionen einfügen / entfernen und nur sequentiell lesen
ArrayDeque
(nur java6) = gut, wenn Sie am Anfang / Ende einfügen / entfernen und zufällig oder sequentiell lesen
Standardmäßig bevorzuge ich LinkedList
bis ArrayList
. Offensichtlich verwende ich sie nicht über die List
-Schnittstelle, sondern über die Collection
-Schnittstelle.
Im Laufe der Zeit habe ich tatsächlich herausgefunden, dass ich, wenn ich eine generische Sammlung brauche, mehr oder weniger Dinge hineinlege und dann darüber iteriere. Wenn ich mehr entwickeltes Verhalten benötige (sagen wir Random Access, Sortierung oder Unicity Checks), werde ich dann vielleicht die verwendete Implementierung ändern, aber vorher werde ich die verwendete Schnittstelle auf die am besten geeignete ändern. Auf diese Weise kann ich sicherstellen, dass das Feature bereits zur Verfügung steht, um sich auf die Optimierung und Implementierung zu konzentrieren.
Wenn die Bestellung und Duplikate kein Problem darstellen und der Fall nur zum Speichern dient,
Ich benutze ArrayList , wie es implementiert alle Listenoperationen. Niemals irgendwelche Performance-Probleme mit diesen Operationen (Nie auch Auswirkungen auf meine Projekte). Die Verwendung dieser Operationen hat eine einfache Verwendung & amp; Ich muss mich nicht darum kümmern, wie es intern verwaltet wird.
Nur wenn mehrere Threads auf diese Liste zugreifen, verwende ich Vector , weil seine Methoden synchronisiert sind.
Auch ArrayList und Vector sind Sammlungen, die Sie zuerst lernen:).
Es hängt davon ab, was Sie darüber wissen.
Wenn ich keine Ahnung habe, tendiere ich zu einer verketteten Liste, da die Strafe für das Hinzufügen / Entfernen am Ende konstant ist. Wenn ich eine ungefähre Vorstellung von der maximalen Größe davon habe, gehe ich für eine Arraylist mit der angegebenen Kapazität, weil es schneller ist, wenn die Schätzung gut ist. Wenn ich wirklich die genaue Größe kenne, tendiere ich dazu, mich für ein normales Array zu entscheiden; obwohl das nicht wirklich ein Sammlungstyp ist.
Mir ist klar, dass alle Diskussionen über die Leistung etwas bedeutungslos sind, das einzige, was wirklich zählt, ist die Messung.
Das stimmt nicht unbedingt.
Wenn Sie wissen, wie die Anwendung funktioniert sagt Ihnen, dass bestimmte Sammlungen sehr groß sein werden, dann ist es eine gute Idee, den richtigen Sammlungstyp auszuwählen. Aber der richtige Sammlungstyp hängt entscheidend davon ab, wie die Sammlungen verwendet werden sollen. auf den Algorithmen.
Wenn Ihre Anwendung wahrscheinlich dominiert, wenn eine Sammlung ein bestimmtes Objekt enthält, dann ist die Tatsache, dass Collection.contains(Object)
für O(N)
und LinkedList<T>
% ArrayList<T>
ist, möglicherweise bedeutet, dass keine der beiden Arten der Sammlung geeignet ist. Stattdessen sollten Sie die Sammlung möglicherweise als HashMap<T, Integer>
darstellen, wobei Integer
die Anzahl der Vorkommen von T
in der "Sammlung" darstellt. Das wird O(1)
testen und entfernen, auf Kosten von mehr Speicherplatz und langsamer (aber immer noch O(1)
) Einfügung.
Aber die Sache, die Sie betonen sollten, ist, dass, wenn Sie wahrscheinlich mit wirklich großen Sammlungen zu tun haben, es keinen Sammlungs-Typ "Standard" geben sollte. Sie müssen über die Sammlung im Kontext der Algorithmen nachdenken. (Und die Kehrseite ist, dass, wenn die Sammlungen immer klein sein werden, es wahrscheinlich wenig Unterschied ist, welchen Sammlungstyp Sie auswählen.)
Tags und Links java collections