2009-11-24 9 views
26

Früher hätte ich immer gedacht, dass ein Vektor für nicht-beschreibende Objekte gut war, wenn die Länge unbekannt war. Soweit ich bewusst war, dachte ich, es war Thread-sicher zujava.util.Vector - Alternativen

Was würde sich ändern, dass Vector nicht mehr verwendet werden sollte, und was ist die Alternative?

+1

Es ist seltsam, dass 'Vector' nicht veraltet ist. Ich nehme an, da es keinen Eins-zu-eins-Ersatz gibt, haben sie das nicht getan. – skaffman

+0

Beachten Sie, dass dies auch für Hashtable gilt - verwenden Sie stattdessen HashMap. –

+0

@skaffman 'CopyOnWriteArrayList' ist mehr oder weniger ein Eins-für-Eins-Ersatz, insofern es eine threadsafe 'List'-Implementierung ist. Für die meisten Verwendungen sollte 'CopyOnWriteArrayList' eine bessere Leistung als' Vector' bieten –

Antwort

35

Sie sollten ArrayList anstelle von Vector verwenden. Vector verwendet interne Synchronisation, aber das ist selten gut genug für die tatsächliche Konsistenz und verlangsamt nur die Ausführung, wenn es nicht wirklich benötigt wird.

Siehe auch this stackoverflow question.

+11

Guter Punkt darüber, selten "gut genug für die tatsächliche Konsistenz" zu sein. Wenn eine Sammlung für mehrere Threads sichtbar ist, sollten Sie wahrscheinlich die entsprechende Sammlung aus 'java.util.concurrent' verwenden (und gründlich verstehen). Und wenn es nicht für mehrere Threads zugänglich ist, ist eine 'ArrayList' günstiger. Eliminieren Sie graue Bereiche, in denen eine Sammlung "möglicherweise" von mehreren Threads verwendet wird: Sie können eine Sammlung nicht an sich fadensicher machen; wie seine Kunden es benutzen, ist immer ein Faktor. – erickson

+0

wissen Sie heute, ob Vector verbessert wurde oder ob wir bei ArrayList bleiben müssen? –

+1

@AquariusPower Der Vertrag gibt an, dass die Synchronisierung verwendet werden muss, damit sie nicht wirklich verbessert werden kann. Das heißt, eine moderne JVM wird manchmal in der Lage sein, die Synchronisation als Optimierung zu entfernen, aber im Allgemeinen ist es besser, ArrayList zu verwenden. –

7

ArrayList ist jetzt die bessere Klasse zu verwenden. Vector gilt jetzt als Legacy und hat den zusätzlichen Leistungsaufwand, Thread-sicher zu sein.

14

Sie können stattdessen einen ArrayList verwenden.

Wenn Sie eine synchronisierte Version benötigen, können Sie so etwas wie:

ArrayList arrayList = new ArrayList(); 

List synchList = Collections.synchronizedList(arrayList); 
7

Verwenden ArrayList, wenn Sie eine List Implementierung benötigen, aber nicht Thread-Sicherheit benötigen, und CopyOnWriteArrayList verwenden, wenn Sie eine List Implementierung benötigen, das ist fadensicher.

5

Vector ist eine Legacy-Erfassungsklasse von Java 1.0. In Java 1.2 (vor langer Zeit!) Wurde die Collections Framework hinzugefügt, die neue Erfassungsklassen wie ArrayList und HashMap enthielt, die die Legacy-Klassen Vector und Hashtable ersetzen sollten.

Wie bereits erwähnt, verfügten die Legacy-Erfassungsklassen über eine integrierte Synchronisation, die für viele Anwendungen nicht erforderlich ist. Die Synchronisierung hat einen Leistungs-Overhead. Wenn dies nicht erforderlich ist, sollten Sie sie nicht verwenden.

In einigen Fällen (wenn Ihr Programm mehrere Threads verwendet und mehrere Threads auf dieselben Daten zugreifen) müssen Sie Ihre Sammlungen synchronisieren. Manche Leute würden dann mit den alten Vector oder Hashtable Klassen, aber eine bessere Art und Weise ist ein Synchronisations Wrapper verwenden zum Beispiel mit einem ArrayList:

// Your standard, unsynchronized list 
List<String> data = new ArrayList<String>(); 

// Use this to put it into a synchronization wrapper 
List<String> syncedData = Collections.synchronizedList(data); 

finden Sie in der API-Dokumentation von Collections.synchronizedList() (und andere Methoden) für weitere Informationen.

+6

Wenn Sie eine threadsichere Liste benötigen, bietet CopyOnWriteArrayList eine bessere Leistung (in den meisten Fällen) als Collections.synchronizedList (Daten) –

+0

@ Dónal Das stimmt nicht wirklich. –

+0

@StefanReich bitte erarbeiten –