Vektor vs. ArrayList in Java
ArrayList und Vector sind die beiden am häufigsten verwendeten Klassen im Paket Collection von Java und der Unterschied zwischen Vector und ArrayList ist eine sehr häufig gestellte Frage. Obwohl dies eine einfache Frage ist, ist es wichtig zu wissen, wann Sie Vector oder ArrayList verwenden sollten, insbesondere wenn Sie an einem großen Projekt arbeiten.In diesem Artikel werden wir uns die Unterschiede zwischen einem Vector und einer ArrayList in Java ansehen und versuchen, das Konzept hinter diesen Unterschieden zu verstehen.
Bevor wir uns mit den Unterschieden zwischen Vector und Vector befassen und ArrayList sehen wir uns die Ähnlichkeiten zwischen diesen beiden an:
- Vector und ArrayList verwenden eine erweiterbare Speicherstruktur.
- ArrayList und Vector verwenden eine interne Array-Struktur.
- Beide Listen behalten die Reihenfolge bei, in der Elemente eingefügt werden. Das bedeutet, dass Sie das Objekt in der Reihenfolge abrufen können, in der es eingefügt wurde, wenn Sie ArrayList oder Vector.
- Vector und ArrayList durchsuchen, doppelte Elemente zulassen und NULL-Werte.
- Iterator und listIterator, die von Vector und ArrayList zurückgegeben werden, vom Typ fail-fast.
Vector vs ArrayList
1) Synchronisation
ArrayList ist nicht synchronisiert, was bedeutet, dass mehrere Threads gleichzeitig darauf zugreifen können. Wenn ein Thread beispielsweise einen Anfügevorgang in ArrayList ausführt, führt ein anderer Thread möglicherweise einen parallelen Löschvorgang in einer nicht synchronisierten Multithread-Umgebung aus.
Vector synchronisiert ist. Dies gewährleistet die sichere Verwendung von Threads in einer gleichzeitigen und Multithread-Umgebung. Wenn beispielsweise ein Thread einen Vorgang in Vector ausführt, kann kein anderer Thread darauf zugreifen, bis der erste Thread beendet ist. Im Gegensatz zu ArrayList kann jeweils nur ein Thread einen Vorgang ausführen.
2) Performance
ArrayList ist leistungsfähiger und schneller, da es nicht synchronisiert ist, was es zu einer sehr guten Wahl in einer Singlethread-Umgebung macht. Sie können ArrayList auch in einer Multithreadumgebung verwenden, wenn die Threads nur die Werte von ArrayList lesen.
Da Vector synchronisiert ist, zahlt es den Preis für die Synchronisierung, was es langsam macht und eine schlechte Leistung erbringt. Der Thread, der eine Operation ausführt, blockiert den Zugriff auf die anderen Threads, daher warten sie, bis die Sperre aufgehoben wird.
Da Vector synchronisiert ist, zahlt es den Preis für die Synchronisierung, was es langsam macht und eine schlechte Leistung erbringt. Der Thread, der eine Operation ausführt, blockiert den Zugriff auf die anderen Threads, daher warten sie, bis die Sperre aufgehoben wird.
3) Größenänderung
Die Speicherkapazität beider Listen ist erweiterbar oder kontraktil, Java-Designer haben es dynamisch gestaltet, um eine optimale Speichernutzung zu gewährleisten. Jeder hat jedoch seine eigene Methode. ArrayList wird um die Hälfte vergrößert, während Vector seine Standardgröße verdoppelt. Die Kapazität von ArrayList kann durch Aufrufen der Methode ensureCapacity().
4) fail-fast
Lassen Sie uns zunächst verstehen, was ein Fail-Fast ist: Wenn die Sammlung (ArrayList, Vector usw.) mit Ausnahme der Iterator-Add- und Remove-Operationen geändert wird, löst der Iterator nach dem Erstellen des Iterators eine Ausnahme aus ConcurrentModificationException. Das Ändern der Struktur hängt mit dem Hinzufügen oder Entfernen von Elementen aus der Sammlung zusammen.
Vector gibt ein Enumeration-Objekt zurück, indem elements() das ist kein Fehler. Auf der anderen Seite sind Iterator und ListIterator, die von ArrayList zurückgegeben werden, ausfallschnell.
5) Wer gehört wirklich zum Collection-Framework?
Vector ist eine dieser Klassen, die mit JDK 1.0 eingeführt wurden und ursprünglich nicht Teil des Collection-Frameworks waren, aber in der neuesten Version berücksichtigt wurden, da sie die List-Schnittstelle implementiert, es wurde Teil der collection.
ArrayList Framework wurde nach Vector mit der Veröffentlichung von JDK 1.2 eingeführt. ArrayList war fortschrittlicher als Vector, hatte aber auch alle Spezifikationen von Vector. Also begannen die Leute, ArrayList anstelle von Vector zu verwenden, und in diesem Fall wurde Vector zu einer Legacy-Klasse.
Die Synchronisationsvorgänge verbrauchen im Vergleich zu nicht synchronisierten Vorgängen viel Zeit, wenn Ihre Anwendung also schneller ausgeführt werden muss und keine Synchronisierung benötigt, ist ArrayList die richtige Wahl, was die Leistung angeht.
Diese Tabelle fasst die 5 Unterschiede zusammen, die wir gesehen haben:
4) fail-fast
Lassen Sie uns zunächst verstehen, was ein Fail-Fast ist: Wenn die Sammlung (ArrayList, Vector usw.) mit Ausnahme der Iterator-Add- und Remove-Operationen geändert wird, löst der Iterator nach dem Erstellen des Iterators eine Ausnahme aus ConcurrentModificationException. Das Ändern der Struktur hängt mit dem Hinzufügen oder Entfernen von Elementen aus der Sammlung zusammen.
Vector gibt ein Enumeration-Objekt zurück, indem elements() das ist kein Fehler. Auf der anderen Seite sind Iterator und ListIterator, die von ArrayList zurückgegeben werden, ausfallschnell.
5) Wer gehört wirklich zum Collection-Framework?
Vector ist eine dieser Klassen, die mit JDK 1.0 eingeführt wurden und ursprünglich nicht Teil des Collection-Frameworks waren, aber in der neuesten Version berücksichtigt wurden, da sie die List-Schnittstelle implementiert, es wurde Teil der collection.
ArrayList Framework wurde nach Vector mit der Veröffentlichung von JDK 1.2 eingeführt. ArrayList war fortschrittlicher als Vector, hatte aber auch alle Spezifikationen von Vector. Also begannen die Leute, ArrayList anstelle von Vector zu verwenden, und in diesem Fall wurde Vector zu einer Legacy-Klasse.
Wann sollten Vector und ArrayList verwendet werden?
Es hängt von Ihren Bedürfnissen ab, wenn Ihr Code die Synchronisierung der Prozesse (Threads) durchführt, wäre Vector die beste Wahl, da es sicherstellt, dass jeweils nur ein Thread auf die Sammlung zugreift.Die Synchronisationsvorgänge verbrauchen im Vergleich zu nicht synchronisierten Vorgängen viel Zeit, wenn Ihre Anwendung also schneller ausgeführt werden muss und keine Synchronisierung benötigt, ist ArrayList die richtige Wahl, was die Leistung angeht.
Diese Tabelle fasst die 5 Unterschiede zusammen, die wir gesehen haben:
ArrayList | Vector | 1) ArrayList ist nicht synchronisiert. | Vector is synchronized |
---|---|
2) ArrayList erhöht 50% seiner aktuellen Größe, wenn die Anzahl der Elemente seine Kapazität überschreitet | Vector invrementes 100%, d.h. das Doppelte seiner ursprünglichen Größe, wenn die Anzahl der Elemente seine Kapazität überschreitet | 3) ArrayList wurde in JDK 1.2. | Vector wurde in JDK 1.0 eingeführt |
4) ArrayList ist schnell, weil es nicht synchronisiert ist | Vector ist langsam, weil es synchronisiert ist. In einem Wettbewerbsumfeld blockiert es den Zugriff anderer Prozesse, bis der erste Thread den Zugriff zulässt |
5) ArrayList verwendet Iterator, um durch Elemente zu iterieren | Vector verwendet die Enumeration-Schnittstelle, um durch Elemente zu iterieren, aber: Es kann auch Iterator verwenden |