safe ArrayList und Vektoren in Java, wenn Thread-Sicherheit kein Problem ist




java vector (4)

Gibt es wirklich einen großen Unterschied zwischen der Leistung von Vector und ArrayList ? Ist es ratsam, ArrayLists immer dann zu verwenden, wenn die Thread-Sicherheit kein Problem darstellt?


Vector stammt aus den Tagen vor der Collections-API und wurde nachgerüstet, um ein Teil davon zu sein. Was ich gelesen habe, ist der Grund, warum es nicht veraltet ist, weil die Kern-API davon abhängt.

ArrayList wurde von Grund auf als Teil der Collections API geschrieben und sollte daher verwendet werden, es sei denn, Sie müssen Java-Versionen bis 1.2 unterstützen.

Wenn Sie eine threadsichere ArrayList benötigen, können Sie die statische Factory-Methode Collections.synchronizedList(new ArrayList<type>); um deine Liste zu erstellen.


ArrayList vs. Vektoren

1. Synchronisation und Thread-Sicherheit

Der erste und wichtigste Unterschied zwischen Vector und ArrayList ist, dass Vector synchronisiert ist und ArrayList nicht, was bedeutet, dass alle Methoden, die Vector strukturell modifizieren, zB add () oder remove () synchronisiert werden, was es threadsicher macht und es ermöglicht, sicher in einer Multi-Threaded- und Concurrent-Umgebung eingesetzt werden. Auf der anderen Seite sind ArrayList-Methoden nicht synchronisiert und daher nicht für die Verwendung in Multithread-Umgebungen geeignet.

2. Geschwindigkeit und Leistung

ArrayList ist viel schneller als Vector. Da Vector synchronisiert und threadsicher ist, zahlt es den Preis der Synchronisation, was es wenig langsam macht. Auf der anderen Seite ist ArrayList nicht synchronisiert und schnell, was die offensichtliche Wahl in einer Single-Threaded-Access-Umgebung macht.

3. Kapazität

Jedes Mal, wenn Vector den angegebenen Schwellenwert überschreitet, erhöht es sich um den im Feld capacityIncrement angegebenen Wert, während Sie die Größe von ArrayList durch den Aufruf der Methode ensureCapacity() erhöhen können.

4. Aufzählung und Iterator

Vector kann die Aufzählung von Elementen zurückgeben, die es enthält, indem es die Methode elements() aufruft, die nicht fehlschlagssicher ist, im Gegensatz zu Iterator und ListIterator von ArrayList .

5. Legacy

Ein weiterer Punkt, den Sie sich merken sollten, ist Vector, eine der Klassen, die mit JDK 1.0 ausgeliefert wird und ursprünglich nicht Teil des Collection-Frameworks ist. In einer späteren Version wurde die List-Schnittstelle jedoch neu berechnet, damit sie Teil eines Collection-Frameworks werden kann.


Wenn Thread-Sicherheit kein Problem ist, sollten Sie immer ArrayList . Vector hat den Overhead der Synchronisation und es wurde gezeigt, dass die Leistungsunterschiede zwischen ArrayList und Vector miserabel sind. Sie können nach vielen Leistungsbenchmarks googeln.

Hier ist ein Timing & Performance .


Wenn Sie die Synchronisation ignorieren, besteht der Hauptunterschied zwischen Vector und ArrayList darin, dass Vector ein größenveränderliches Array ist (ähnlich einem C ++ - STL-Vektor) und ArrayList eine Liste ist, die zufällig von einem Array unterstützt wird.

Der Unterschied manifestiert sich in der Methode setSize () . Es gibt keine gleichwertige Methode in ArrayList . Einige Ex-C ++ Java-Entwickler hängen daran fest. Es gibt eine Reihe einfacher Möglichkeiten, dies zu umgehen, sodass es kein Problem sein sollte.

Machen Sie nicht den Fehler, einem C ++ - Entwickler ArrayList dass eine ArrayList einem std::vector . Du hörst nie das Ende davon.







collections