Was sind die Unterschiede zwischen ArrayList und Vector?

352

Was sind die Unterschiede zwischen den beiden Datenstrukturen ArrayList und Vector und wo sollten Sie sie jeweils verwenden?

KushalP
quelle
5
Ich sehe hier nicht das genaue Duplikat.
Jeff Atwood
2
Nun, Sie können auch Vektoren in Java erstellen - Vector v = new Vector(3, 2);
sgsi
Niemals benutzen Vector, benutzen ArrayListoder LinkedListoderArrayDeque

Antworten:

365

Unterschiede

  • Vektoren werden synchronisiert, ArrayLists nicht.
  • Datenwachstumsmethoden

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.

Referenz

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.

Referenz

Sev
quelle
7
@Rei Genau das, was er gesagt hat: Mehrere Threads ( docs.oracle.com/javase/tutorial/essential/concurrency/… )
RecursiveExceptionException
Was ist mit dem Lesen aus einer ArrayList auf Multithread-Weise? Ist das threadsicher?
Xunie
@ Xunie Das Lesen aus ArrayList oder anderen Sammlungsklassen ist nie ein Problem. Das Problem tritt auf, wenn Sie der ArrayList oder der Auflistung vorhandene Werte hinzufügen, entfernen oder ändern.
Sainath Reddy
85

Wie in der Dokumentation angegeben, sind a Vectorund an ArrayListfast gleichwertig. Der Unterschied besteht darin, dass der Zugriff auf a Vectorsynchronisiert ist, während der Zugriff auf a ArrayListnicht synchronisiert ist. Dies bedeutet, dass jeweils nur ein Thread Methoden aufrufen kann Vectorund 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.synchronizedListFunktion zum Erstellen einer synchronisierten Liste, wodurch Sie das Äquivalent von a erhalten Vector.

Antal Spector-Zabusky
quelle
53

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

Böhmisch
quelle
10
synchronisiert aber nicht threadsicher? was bedeutet das? [Ich bin Anfänger]
Dineshkumar
13
@Dineshkumar Vectorwurde 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.
Böhmisch
1
@ Dineshkumar sehen diese Frage
Bohemian
3
@ Dineshkumar sorry - das war kein guter Link. Hier ist die endgültige Antwort . Kurz gesagt, seine Synchronisation ist nutzlos.
Böhmisch
7
Unterhaltsame Tatsache: Der Stack von Java1.7 verwendet die Vector-Klasse.
Tobi
26

ArrayList ist neuer und 20-30% schneller.

Wenn Sie nichts explizit Offensichtliches benötigen Vector, verwenden SieArrayList

Oli
quelle
32
Können Sie die Behauptung durch Beweise unterstützen 20-30% faster?
Benutzer
5
@user Zu der Zeit war es nur eine persönliche Erfahrung, wie man durch riesige Arrays klapperte. Über drei Jahre später kann ich Sie nicht genau auf das hinweisen, worüber ich gesprochen habe, aber es gibt viele Benchmarks. Erst beim Threading sehen Sie die größten Sprünge, aber hier ist einer: javacodegeeks.com/2010/08/…
Oli
Die 20-30% stimmen nur überein, wenn Sie in den Vektor / die Arrayliste lesen UND schreiben, da die Wachstumsfunktion den größten Einfluss hat. Wenn Sie einen Benchmark haben, der nur einmal schreibt und dann nur Lesevorgänge ausführt, erhalten Sie ein anderes Ergebnis
Tobi
2
Bitte
legen
Da der Vektor synchronisiert ist und die Arrayliste nicht synchronisiert ist, kann dies ein Grund sein, dass die Arrayliste schneller als der Vektor ist.
ASK
23

Es gibt zwei Hauptunterschiede zwischen Vector und ArrayList.

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

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

  1. Um das Element von Vector an einer bestimmten Stelle abzurufen, verwenden wir die Funktion elementAt (int index). Dieser Funktionsname ist sehr lang. Anstelle dessen haben wir in ArrayList get (int index), das sehr einfach zu merken und zu verwenden ist.
  2. In ähnlicher Weise verwenden wir zum Ersetzen eines vorhandenen Elements durch ein neues Element in Vector die Methode setElementAt (), die wiederum sehr langwierig ist und den Programmierer möglicherweise irritiert, sie wiederholt zu verwenden. Anstelle dieser ArrayList gibt es eine Methode zum Hinzufügen (int index, object), die einfach zu verwenden und zu merken ist. Auf diese Weise haben sie programmiererfreundlichere und benutzerfreundlichere Funktionsnamen in ArrayList.

Wann welches verwenden?

  1. Vermeiden Sie die Verwendung von Vektoren vollständig. ArrayLists können alles, was ein Vektor kann. Darüber hinaus sind ArrayLists standardmäßig nicht synchronisiert. Wenn Sie möchten, können Sie es jederzeit mit der Collections util-Klasse synchronisieren.
  2. ArrayList hat leicht zu merkende und zu verwendende Funktionsnamen.

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.

user1923551
quelle
5
Falsche Informationen (umgeschaltet) beim Vergrößern von ArrayLIst und Vector, ansonsten recht gute Antwort.
Nenad Bulatovic
Das Wachstum von Vector verdoppelt sich mit den erforderlichen docs.oracle.com/javase/7/docs/api/java/util/Vector.html während von ArrayList konstante amortisierte Zeitkosten. " docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib
Ich verstehe nicht, wie der Methodenname ein Kriterium für die Verwendung oder Nichtverwendung dieser Methode sein kann.
Surender Kherwa
14

ArrayListund Vectorbeide implementiert die List-Schnittstelle und behalten die Einfügereihenfolge bei. Aber es gibt viele Unterschiede zwischen ArrayListund VectorKlassen ...

ArrayList -

  1. ArrayList ist nicht synchronisiert.
  2. ArrayList erhöht 50% der aktuellen Arraygröße, wenn die Anzahl der Elemente die Kapazität überschreitet.
  3. ArrayList ist keine Legacy-Klasse, sondern wird in JDK 1.2 eingeführt.
  4. ArrayList ist schnell, weil es nicht synchronisiert ist.
  5. ArrayList verwendet die Iterator-Schnittstelle, um die Elemente zu durchlaufen.

Vektor -

  1. Vector ist synchronisiert.
  2. Vector Inkremente 100% bedeuten, dass die Arraygröße verdoppelt wird, wenn die Gesamtzahl der Elemente die Kapazität überschreitet.
  3. Vector ist eine Legacy-Klasse.

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

  5. Vectorverwendet 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

Roottraveller
quelle
10

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: Geben Sie hier die Bildbeschreibung ein

Subhashis
quelle
1
Warum ist das Hinzufügen von Objekten zuerst und am Ende in LinkedList langsam? Sollte es nicht schneller sein als BEIDE ArrayList und Vektor?
CHANist
@ CHANist Ich stimme auch zu. Das Hinzufügen eines Objekts am Anfang und Ende sollte schneller sein als das Hinzufügen eines Objekts in der Mitte.
Rahul Rastogi
1
Die in der Spalte LinkedList dieser Tabelle verwendete Sprache ist widersprüchlich. Das Voranstellen und Anhängen an eine LinkedList ist schneller als das Hinzufügen von Elementen in der Mitte, jedoch langsamer als das Voranstellen oder Anhängen an ArrayLists oder Vektoren. Dies liegt daran, dass für jede Einfügung eine Speicherzuweisung mit nicht lokalen Referenzen erforderlich ist, wodurch die Wahrscheinlichkeit von Cache-Fehlern erhöht wird. Obwohl die Suche in einer LinkedList linear zur Anzahl der Elemente ist und kein Zeiger auf das Ende gespeichert ist, ist das Anhängen immer noch schneller als das Voranstellen, da der Speicher nur für ein Element neu zugewiesen wird.
Sophia Gold