Warum ist Java Vector (und Stack) Klasse als veraltet oder deprecated?
Warum ist Java Vektor-als ein Vermächtnis-Klasse, überholt oder veraltet?
Nicht seine Verwendung gültig, wenn die Arbeit mit Parallelität?
Und wenn ich das nicht möchte, manuell zu synchronisieren Objekte und wollen einfach nur verwenden Sie eine thread-sichere collection, ohne, um frische Kopien der zugrunde liegenden array (als CopyOnWriteArrayList
tut), dann ist es in Ordnung zu verwenden Vector
?
Was Stack
, welche eine Unterklasse von Vector
, was sollte ich verwenden, statt es?
- Sie sind veraltet, aber Sie sind nicht veraltet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vector
synchronisiert auf jedem einzelnen Betrieb. Das ist fast nie das, was Sie tun möchten.In der Regel, die Sie synchronisieren möchten eine ganze Sequenz von Operationen. Synchronisieren von einzelnen Operationen ist auch weniger sicher (wenn Sie Durchlaufen ein
Vector
, zum Beispiel, werden Sie noch brauchen, um eine Sperre zu vermeiden, dass jemand anderes ändern Sie die Sammlung in der gleichen Zeit, die Ursache wäre einConcurrentModificationException
in der Iteration thread), aber auch langsamer (warum nehmen Sie eine Sperre wiederholt, wenn einmal ausreichend sein werden)?Natürlich, es hat auch der Aufwand für das sperren auch, wenn Sie nicht müssen.
Im Grunde ist es eine sehr mangelhafte Ansatz zur Synchronisation in den meisten Situationen. Als Herr Brian Henk darauf hingewiesen, können Sie schmücken eine Kollektion mit den anrufen wie
Sammlungen.synchronizedList
- die Tatsache, dassVector
vereint sowohl die "verkleinerte array" - Kollektion der Umsetzung mit dem "synchronisieren jeden Betrieb" - bit ist ein weiteres Beispiel für schlechtes design; die Dekoration Ansatz sorgt für eine sauberere Trennung von Bedenken.Als für eine
Stack
entspricht, würde ich schauenDeque
/ArrayDeque
mit zu beginnen.Vector
weniger effizient in Bezug auf die Synchronisation unnötig, aber dadurch, dass die Synchronisation kann es geben, die illusion als thread-sichere Benutzer, die neu auf Durchzug und denke, dass das synchronisieren jeder Betrieb ausreichend ist, um es sicher zu verwenden beliebig auf mehrere threads. Ich bin immer noch sehr zufrieden, zu empfehlen bewegen vonVector
zuArrayList
in fast allen Fällen.LinkedList<T>
ist besser alsArrayList<T>
in irgendeinem Situationen, das Gegenteil ist oft wahr - weder effektiv deprecates die anderen.Vector
ist offiziell nicht mehr, wohlgemerkt... nur wieDate
undCalendar
nicht, aber ich würde nicht wollen, um diese in neue Entwicklung entweder.)Stack
entspricht, würde ich schauenDeque
/ArrayDeque
mit zu beginnen." TutStack
auch synchronisiert Methoden Ihrer übergeordneten KlasseVector
? Sollten wir ersetzenStack
mitCollections.synchronizedList
anwenden zuDeque/ArrayDeque
?Stack
gehen über die superclass-Methoden sowieso, aber ich würde noch prüfen, um sicher zu sein.Vektor wurde ein Teil von 1.0 -- die original-Implementierung hatte zwei Nachteile:
1. Benennung: Vektoren sind eigentlich nur Listen, die zugegriffen werden kann, wie arrays, so ist es sollte genannt worden
ArrayList
(das ist die Java-1.2-Sammlungen Ersatz fürVector
).2. Parallelität: Alle
get()
,set()
Methoden sindsynchronized
, so dass Sie nicht haben, können feinkörnige Kontrolle über die Synchronisation.Es ist nicht viel Unterschied zwischen
ArrayList
undVector
, aber Sie solltenArrayList
.Aus der API-doc.
ArrayList
,LinkedList
usw., alle, die das interface implementierenList
, also, wenn Sie wollen, nutzen Sie dieList
Methoden, ohne zu wissen, was die zugrunde liegende Implementierung tatsächlich ist, können Sie nur einenList
als parameter an Methoden, etc. Das gleiche gilt für Implementierer vonMap
und so weiter. Mittlerweile, C++ hat einestd::array
Klasse, das ist nur ein template-basierter Ersatz für C-style-statische Länge von arrays.Neben den bereits genannten Antworten über die Verwendung von Vektor-Vektor hat auch eine Reihe von Methoden, um die Aufzählung und Elemente abrufen, die anders sind, als die Liste Benutzeroberfläche, und die Entwickler (vor allem diejenigen, die gelernt Java vor Version 1.2) können dazu neigen, Sie zu benutzen, wenn Sie in den code. Obwohl Aufzählungen sind schneller, Sie prüfen nicht, wenn die Sammlung geändert wurde während der iteration, die Probleme verursachen können, und da dieser Vektor kann gewählt werden, für seine syncronization - mit der Telefonzentrale Zugriff von mehreren threads, das macht es eine besonders tückische problem. Die Nutzung dieser Methoden auch Paare, die eine Menge von code-Vektor, so dass es nicht einfach sein, Sie zu ersetzen mit einer anderen Liste-Implementierung.
Können Sie die synchronizedCollection/List Methode auf
java.util.Collection
um eine thread-sichere collection aus einer nicht thread-sicher ist.java.util.Stack
erbt der Synchronisations-overheadjava.util.Vector
, die in der Regel nicht gerechtfertigt.Erbt er viel mehr als dass, obwohl. Die Tatsache, dass
java.util.Stack extends java.util.Vector
ist ein Fehler in der Objekt-orientierten design. Puristen werden beachten Sie, dass es bietet auch eine Menge von Methoden, die außerhalb der Operationen, die traditionell im Zusammenhang mit einem Stapel (nämlich: push, pop, peek, Größe). Es ist auch möglich, das zu tunsearch
,elementAt
,setElementAt
,remove
, und viele andere random-access-Betrieb. Es ist im Grunde bis zu dem Benutzer, zu unterlassen, die Verwendung der nicht-stack-OperationenStack
.Für diese Leistungs-und OOP-design-Gründe, die JavaDoc für
java.util.Stack
empfiehltArrayDeque
als der Natürliche Nachfolger. (Eine deque ist mehr als ein Stapel, aber zumindest ist es beschränkt auf die Manipulation der beiden enden, anstatt bietet wahlfreien Zugriff auf alles.)