web-dev-qa-db-ja.com

java.util.Vector-代替

以前は、長さが不明な場合、ベクターは非記述オブジェクトに使用するのが適切だと常に思っていました。私が知っている限り、それもスレッドセーフだと思いました

Vectorを使用しないように変更するものは何ですか?また、代替手段は何ですか?

28
ST.

ArrayListの代わりにVectorを使用する必要があります。 Vectorは内部同期を使用しましたが、実際の一貫性を保つのに十分なことはめったになく、実際に必要でない場合にのみ実行速度が低下します。

このstackoverflowの質問 も参照してください。

38
Paul Wagland

代わりにArrayListを使用できます。

同期バージョンが必要な場合は、次のようなことができます。

ArrayList arrayList = new ArrayList();

List synchList = Collections.synchronizedList(arrayList);
15
hexium

ArrayList実装が必要でスレッドセーフが必要ない場合はListを使用し、スレッドセーフであるCopyOnWriteArrayList実装が必要な場合はListを使用します。

7
Dónal

ArrayListは、使用するのに適したクラスになりました。 Vectorはレガシーと見なされるようになり、スレッドセーフであるというパフォーマンスのオーバーヘッドが追加されました。

7
Kyle Rozendo

VectorはJava 1.0のレガシーコレクションクラスです。Java 1.2(ずっと前に!)では、 コレクションフレームワーク が追加されました。これには、レガシークラスArrayListを置き換えることを目的としたHashMapVectorなどの新しいコレクションクラスが含まれていました。およびHashtable

前に述べたように、レガシーコレクションクラスには同期が組み込まれていましたが、これは多くのアプリケーションでは不要です。同期にはパフォーマンスのオーバーヘッドがあるため、必要がない場合は使用しないでください。

場合によっては(プログラムがマルチスレッドであり、複数のスレッドが同じデータにアクセスする場合)、コレクションを同期する必要があります。その場合、古いVectorまたはHashtableクラスを使用する人もいますが、より良い方法は、たとえば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);
_

詳細については、Collections.synchronizedList()(およびその他のメソッド)のAPIドキュメントを参照してください。

6
Jesper