gui - java swing tutorial deutsch




Warum wird die Java Vector-Klasse als veraltet oder veraltet betrachtet? (4)

Warum wird Java Vector als veraltete oder veraltete Legacy-Klasse betrachtet?

Ist seine Verwendung nicht gültig, wenn mit Nebenläufigkeit gearbeitet wird?

Und wenn ich Objekte nicht manuell synchronisieren möchte und nur eine threadsichere Sammlung verwenden möchte, ohne das zugrundeliegende Array neu zu CopyOnWriteArrayList (wie es CopyOnWriteArrayList tut), ist es in Ordnung, Vector zu verwenden?

Was ist mit Stack , das eine Unterklasse von Vector , was sollte ich stattdessen verwenden?


Neben den bereits erwähnten Antworten zur Verwendung von Vector verfügt Vector auch über eine Reihe von Methoden zum Aufzählen und zum Abrufen von Elementen, die sich von der List - Oberfläche unterscheiden. Entwickler (vor allem diejenigen, die Java vor Version 1.2 gelernt haben) können diese verwenden Code. Obwohl Aufzählungen schneller sind, überprüfen sie nicht, ob die Sammlung während der Iteration geändert wurde, was zu Problemen führen kann, und da Vector möglicherweise für seine Synchronisierung ausgewählt wird - mit dem zugehörigen Zugriff von mehreren Threads ist dies ein besonders schädliches Problem. Die Verwendung dieser Methoden koppelt auch viel Code an Vector, so dass es nicht einfach ist, ihn durch eine andere List-Implementierung zu ersetzen.


Sie können die Methode synchronizedCollection/List für java.util.Collection , um eine Thread-sichere Sammlung von einer nicht threadsicheren Sammlung abzurufen.


Vector bei jeder einzelnen Operation synchronisiert. Das ist fast nie das, was du machen willst.

Im Allgemeinen möchten Sie eine ganze Sequenz von Operationen synchronisieren. Das Synchronisieren einzelner Vorgänge ist weniger sicher (wenn Sie beispielsweise über einen Vector iterieren, müssen Sie dennoch eine Sperre aufheben, um zu vermeiden, dass jemand die Sammlung zur gleichen Zeit ändert, was zu einer ConcurrentModificationException im Iterations-Thread führen würde) langsamer (warum eine Sperre immer wieder herausnehmen, wenn einmal genug ist)?

Natürlich hat es auch den Overhead von Sperren, selbst wenn Sie es nicht brauchen.

Grundsätzlich ist es in den meisten Situationen ein sehr fehlerhafter Ansatz für die Synchronisation. Wie Herr Brian Henk ausgeführt hat, können Sie eine Sammlung mit Aufrufen wie Collections.synchronizedList dekorieren - die Tatsache, dass Vector sowohl die Implementierung der "resized array" -Ansammlung mit dem Bit "Synchronize eaching operation" kombiniert, ist ein weiteres Beispiel für schlechtes Design. Der Dekorationsansatz sorgt für eine sauberere Trennung der Anliegen.

Was ein Stack Äquivalent Deque - ich würde zuerst Deque / ArrayDeque .


java.util.Stack erbt den Synchronisations-Overhead von java.util.Vector , der normalerweise nicht gerechtfertigt ist.

Es erbt jedoch viel mehr als das. Die Tatsache, dass java.util.Stack extends java.util.Vector ist ein Fehler im objektorientierten Design. Puristen werden bemerken, dass es auch viele Methoden jenseits der Operationen anbietet, die traditionell mit einem Stack verbunden sind (nämlich: Push, Pop, Peek, Size). Es ist auch möglich, search , elementAt , setElementAt , remove und viele andere Operationen mit wahlfreiem Zugriff durchzuführen. Es ist grundsätzlich Sache des Benutzers, die Nicht-Stack-Operationen von Stack zu unterlassen.

Für diese Leistungs- und OOP-Entwurfsgründe empfiehlt ArrayDeque für java.util.Stack ArrayDeque als natürlichen Ersatz. (Eine Deque ist mehr als ein Stapel, aber zumindest ist sie darauf beschränkt, die beiden Enden zu manipulieren, anstatt zufälligen Zugriff auf alles zu bieten.)





obsolete