以前は、長さが不明な場合、ベクターは非記述オブジェクトに使用するのが適切だと常に思っていました。私が知っている限り、それもスレッドセーフだと思いました
Vector
を使用しないように変更するものは何ですか?また、代替手段は何ですか?
ArrayList
の代わりにVector
を使用する必要があります。 Vector
は内部同期を使用しましたが、実際の一貫性を保つのに十分なことはめったになく、実際に必要でない場合にのみ実行速度が低下します。
このstackoverflowの質問 も参照してください。
代わりにArrayList
を使用できます。
同期バージョンが必要な場合は、次のようなことができます。
ArrayList arrayList = new ArrayList();
List synchList = Collections.synchronizedList(arrayList);
ArrayList
実装が必要でスレッドセーフが必要ない場合はList
を使用し、スレッドセーフであるCopyOnWriteArrayList
実装が必要な場合はList
を使用します。
ArrayList
は、使用するのに適したクラスになりました。 Vector
はレガシーと見なされるようになり、スレッドセーフであるというパフォーマンスのオーバーヘッドが追加されました。
Vector
はJava 1.0のレガシーコレクションクラスです。Java 1.2(ずっと前に!)では、 コレクションフレームワーク が追加されました。これには、レガシークラスArrayList
を置き換えることを目的としたHashMap
やVector
などの新しいコレクションクラスが含まれていました。および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ドキュメントを参照してください。