Unterschied zwischen ArrayList und Vektor in Java
ArrayList und Vektor verwenden beide Array intern als Datenstruktur. Es gibt jedoch nur wenige Unterschiede in der Art und Weise, wie sie die Daten speichern und verarbeiten. In diesem Beitrag werden wir den Unterschied und die Ähnlichkeiten zwischen ArrayList und Vektor diskutieren.
ArrayList Vs Vektor:
1) Synchronisation: ArrayList ist nicht synchronisiert, was bedeutet, dass mehrere Threads gleichzeitig an ArrayList arbeiten können. Für z.B. wenn ein Thread eine Add-Operation für ArrayList ausführt, kann ein anderer Thread gleichzeitig eine Remove-Operation für ArrayList in einer Multithread-Umgebung
ausführen, während der Vektor synchronisiert ist. Dies bedeutet, wenn ein Thread am Vektor arbeitet, kann kein anderer Thread ihn erreichen. Im Gegensatz zu ArrayList kann jeweils nur ein Thread eine Operation für den Vektor ausführen.
2) Größe ändern: Sowohl ArrayList als auch Vector können dynamisch wachsen und schrumpfen, um die optimale Nutzung des Speichers zu gewährleisten. ArrayList wächst um die Hälfte seiner Größe, wenn die Größe geändert wird, während Vector die Größe von sich selbst standardmäßig verdoppelt, wenn es wächst.
3) Leistung: ArrayList bietet eine bessere Leistung, da es nicht synchronisiert ist. Der Thread, der mit dem Vektor arbeitet, erhält eine Sperre, wodurch andere Threads warten, bis die Sperre aufgehoben wird.
4) fail-fast: Lassen Sie mich zuerst erklären, was fail-fast ist: Wenn die Sammlung (ArrayList, Vektor usw.) mit Ausnahme der Methoden zum Hinzufügen oder Entfernen des Iterators nach dem Erstellen des Iterators strukturell geändert wird, wirft der Iterator ConcurrentModificationException
. Strukturelle Änderung bezieht sich auf das Hinzufügen oder Löschen von Elementen aus der Sammlung.
Gemäß dem Vektor-Javadoc ist die von Vector zurückgegebene Aufzählung nicht ausfallsicher. Auf der anderen Seite sind der Iterator und der ListIterator, die von ArrayList zurückgegeben werden, ausfallsicher.
5) Wer gehört wirklich zu Collection Framework? Der Vektor war nicht Teil des Sammlungsframeworks, er wurde später in Sammlungen aufgenommen. Es kann als Legacy-Code betrachtet werden. Es gibt nichts über Vektor, was List Collection nicht tun kann. Daher sollte Vektor vermieden werden. Wenn ein threadsicherer Betrieb erforderlich ist, machen Sie ArrayList synchronisiert, wie im nächsten Abschnitt dieses Beitrags beschrieben, oder verwenden Sie CopyOnWriteArrayList , eine threadsichere Variante von ArrayList .
Es gibt wenige Ähnlichkeiten zwischen diesen Klassen, die wie folgt sind:
- Sowohl Vector als auch ArrayList verwenden eine erweiterbare Array-Datenstruktur.
- Der Iterator und der ListIterator, die von diesen Klassen (Vector und ArrayList ) zurückgegeben werden, sind ausfallsicher.
- Beide sind geordnete Sammlungsklassen, da sie die Einfügereihenfolge der Elemente beibehalten.
- Vector & ArrayList erlaubt sowohl doppelte als auch Null-Werte.
- Sie wachsen und schrumpfen automatisch, wenn Überlauf und Löschen auftreten.
Wann wird ArrayList und wann Vektor verwendet?
Es hängt völlig von der Anforderung ab. Wenn eine „thread-sichere“ Operation durchgeführt werden muss, ist der Vektor die beste Wahl, da sichergestellt wird, dass jeweils nur ein Thread auf die Sammlung zugreift.
Leistung: Synchronisierte Operationen verbrauchen mehr Zeit als nicht synchronisierte, wenn also kein Thread-sicherer Betrieb erforderlich ist, ist ArrayList eine bessere Wahl, da die Leistung aufgrund der gleichzeitigen Prozesse verbessert wird.
Wie mache ich ArrayList synchronisiert?
Wie oben erwähnt, sind ArrayList Methoden nicht synchronisiert, aber wenn es notwendig ist, können Sie sie so synchronisieren –
//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}