Standard Sammlungsart

8

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 ?

    
Dónal 18.08.2010, 08:25
quelle

6 Antworten

8

"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

    
redCube 18.08.2010 08:57
quelle
1

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.

    
Riduidel 18.08.2010 08:29
quelle
1

ArrayList enthält grundsätzlich ein Array innerhalb (deshalb heißt es ArrayList). Operationen wie addd / remove an beliebigen Positionen werden auf einfache Weise ausgeführt. Wenn Sie sie nicht verwenden, wird die Leistung nicht beeinträchtigt.

    
falagar 18.08.2010 08:30
quelle
0

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:).

    
YoK 18.08.2010 08:33
quelle
0

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.

    
Joeri Hendrickx 18.08.2010 09:38
quelle
0
  

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.)

    
Stephen C 18.08.2010 10:53
quelle

Tags und Links