Was sind die Unterschiede zwischen den beiden Datenstrukturen ArrayList und Vector und wo sollten Sie sie jeweils verwenden?
Vector v = new Vector(3, 2);
Was sind die Unterschiede zwischen den beiden Datenstrukturen ArrayList und Vector und wo sollten Sie sie jeweils verwenden?
Vector v = new Vector(3, 2);
Antworten:
Unterschiede
Verwenden Sie ArrayLists, wenn für die Verwendung von Vektoren keine besonderen Anforderungen bestehen.
Synchronisation
Wenn mehrere Threads gleichzeitig auf eine ArrayList zugreifen, müssen wir den Codeblock, der die Liste entweder strukturell oder einfach ein Element ändert, extern synchronisieren. Strukturänderung bedeutet Hinzufügen oder Löschen von Elementen aus der Liste. Das Festlegen des Werts eines vorhandenen Elements ist keine strukturelle Änderung.
Collections.synchronizedList
wird normalerweise zum Zeitpunkt der Erstellung der Liste verwendet, um einen versehentlichen nicht synchronisierten Zugriff auf die Liste zu vermeiden.
Datenwachstum
Intern behalten sowohl die ArrayList als auch der Vector ihren Inhalt mithilfe eines Arrays bei. Wenn ein Element in eine ArrayList oder einen Vektor eingefügt wird, muss das Objekt sein internes Array erweitern, wenn der Platz knapp wird. Ein Vektor verdoppelt standardmäßig die Größe seines Arrays, während die ArrayList seine Arraygröße um 50 Prozent erhöht.
Wie in der Dokumentation angegeben, sind a Vector
und an ArrayList
fast gleichwertig. Der Unterschied besteht darin, dass der Zugriff auf a Vector
synchronisiert ist, während der Zugriff auf a ArrayList
nicht synchronisiert ist. Dies bedeutet, dass jeweils nur ein Thread Methoden aufrufen kann Vector
und der Erwerb der Sperre einen geringen Aufwand verursacht. Wenn Sie eine verwenden ArrayList
, ist dies nicht der Fall. Im Allgemeinen möchten Sie ein ArrayList
; Im Fall mit einem Gewinde ist dies die bessere Wahl, und im Fall mit mehreren Gewinden erhalten Sie eine bessere Kontrolle über das Sperren. Möchten Sie gleichzeitige Lesevorgänge zulassen? Fein. Möchten Sie eine Synchronisation für einen Stapel von zehn Schreibvorgängen durchführen? Auch gut. Es erfordert etwas mehr Sorgfalt an Ihrem Ende, aber es ist wahrscheinlich, was Sie wollen. Beachten Sie auch, dass Sie, wenn Sie eine ArrayList haben, die verwenden könnenCollections.synchronizedList
Funktion zum Erstellen einer synchronisierten Liste, wodurch Sie das Äquivalent von a erhalten Vector
.
Vector
ist eine kaputte Klasse, die nicht threadsicher ist, obwohl sie "synchronisiert" ist und nur von Schülern und anderen unerfahrenen Programmierern verwendet wird.
ArrayList
ist die Go-to-List-Implementierung, die von Profis und erfahrenen Programmierern verwendet wird.
Profis, die eine threadsichere Listenimplementierung wünschen, verwenden a CopyOnWriteArrayList
.
Vector
wurde bestimmt THREAD zu sein, hat aber einen Konstruktionsfehler , dass es * nicht in der Tat THREAD macht, ist es im Grunde eine veraltete Klasse. Aus irgendeinem Grund haben Universitäten usw. nichts von diesen Neuigkeiten gehört und befürworten immer noch deren Verwendung.
ArrayList
ist neuer und 20-30% schneller.
Wenn Sie nichts explizit Offensichtliches benötigen Vector
, verwenden SieArrayList
20-30% faster
?
Es gibt zwei Hauptunterschiede zwischen Vector und ArrayList.
Der Vektor ist standardmäßig synchronisiert und die ArrayList nicht. Hinweis: Sie können ArrayList auch synchronisieren, indem Sie das Objekt arraylist an die Methode Collections.synchronizedList () übergeben. Synchronisiert bedeutet: Es kann mit mehreren Threads ohne Nebenwirkungen verwendet werden.
ArrayLists wachsen um 50% der vorherigen Größe, wenn der Platz für ein neues Element nicht ausreicht, während Vector um 100% der vorherigen Größe wächst, wenn kein Platz für ein neues eingehendes Element vorhanden ist.
Abgesehen davon gibt es einige praktische Unterschiede zwischen ihnen hinsichtlich des Programmieraufwands:
Wann welches verwenden?
Hinweis : Auch wenn die Arrayliste um 100% wächst, können Sie dies vermeiden, indem Sie die Methode verifycapacity () verwenden, um sicherzustellen, dass Sie in der Anfangsphase selbst ausreichend Speicher zuweisen.
Ich hoffe es hilft.
ArrayList
und Vector
beide implementiert die List-Schnittstelle und behalten die Einfügereihenfolge bei. Aber es gibt viele Unterschiede zwischen ArrayList
und Vector
Klassen ...
ArrayList
ist nicht synchronisiert.ArrayList
erhöht 50% der aktuellen Arraygröße, wenn die Anzahl der Elemente die Kapazität überschreitet.ArrayList
ist keine Legacy-Klasse, sondern wird in JDK 1.2 eingeführt.ArrayList
ist schnell, weil es nicht synchronisiert ist.ArrayList
verwendet die Iterator-Schnittstelle, um die Elemente zu durchlaufen.Vektor -
Vector
ist synchronisiert.Vector
Inkremente 100% bedeuten, dass die Arraygröße verdoppelt wird, wenn die Gesamtzahl der Elemente die Kapazität überschreitet.Vector
ist eine Legacy-Klasse.
Vector
ist langsam, da es synchronisiert ist, dh in einer Multithreading-Umgebung, hält es die anderen Threads im ausführbaren oder nicht ausführbaren Zustand, bis der aktuelle Thread die Sperre des Objekts aufhebt.
Vector
verwendet die Aufzählungsschnittstelle, um die Elemente zu durchlaufen. Es kann aber auch Iterator verwenden.
Siehe auch: https://www.javatpoint.com/difference-between-arraylist-and-vector
Grundsätzlich verwenden sowohl ArrayList als auch Vector ein internes Objektarray.
ArrayList: Die ArrayList-Klasse erweitert AbstractList und implementiert die List-Schnittstelle und RandomAccess (Marker-Schnittstelle). ArrayList unterstützt dynamische Arrays, die nach Bedarf erweitert werden können. Es gibt uns erste Iteration über Elemente. ArrayList verwendet ein internes Objektarray. Sie werden mit einer anfänglichen Standardgröße von 10 erstellt. Wenn diese Größe überschritten wird, wird die Sammlung automatisch auf die Hälfte der Standardgröße von 15 erhöht.
Vektor: Vektor ähnelt ArrayList, die Unterschiede sind jedoch, dass er synchronisiert ist und seine anfängliche Standardgröße 10 beträgt. Wenn die Größe seine Größe überschreitet, erhöht sich die Größe auf das Doppelte der ursprünglichen Größe, was bedeutet, dass die neue Größe 20 ist. Vektor ist die einzige Klasse andere als ArrayList, um RandomAccess zu implementieren. Vector hat vier Konstruktoren, von denen einer zwei Parameter verwendet. Vector (int initialCapacity, int CapacityIncrement) CapacityIncrement ist der Betrag, um den die Kapazität erhöht wird, wenn der Vektor überläuft, sodass er mehr Kontrolle über den Lastfaktor hat.
Einige andere Unterschiede sind: