複数のスレッドがベクターにアクセスする場合、vectorは、1つのスレッドのみが同時にベクターにアクセスできるようにします。SynchronizedListは同じです。では、違いは何ですか?いくつかの同期状況で選択する方法は?
3 に答える
この冗長性の主な理由は、古いバージョンの Java 用に開発された Java コードとの下位互換性です。
私の記憶が正しければ、Java 1.2 Collections は別のライブラリであり、標準の JDK/JRE の一部ではありませんでした。
その時点で、SDK が提供するデータ構造のようなリストは Vector だけでした。Collections では、開発者はその Vector 構造をさまざまな方法で改善しました。特に、同期はほとんどの場合不要であることが判明したため、同期を削除しました。
それでも、コレクションのようなリストの同期バージョンを簡単に作成できるようにしたいと考えていました。したがって、彼らは SynchronizedList を導入しました。
Vector と SynchronizedList の主な違いは、その使用方法です。Collections.synchronizedList を呼び出すことにより、現在の List 実装のラッパーを作成します。つまり、データを別のデータ構造にコピーせず、基になる構造をそのまま維持します。たとえば、ArrayList ではなく、その背後に LinkedList 構造が必要な場合。
ベクターの場合は、実際にベクター構造のような新しいリストにデータをコピーします。そのため、以前にリストがあった場合は効率が低下しますが、以前にデータ構造がなかった場合は、すべてのメソッド呼び出しにメソッド ラッピング コストが追加されないため、Vector を使用することをお勧めします。ベクターのもう 1 つの欠点は、代替の基になる構造 (LinkedList など) を保持できないことです。ベクター自体に実装されているものを常に使用します。
Java Vector はデフォルトで同期されます。明示的に同期する必要はありません。やっても余計なメリットはない
Java Vector の使用はお勧めできません。代わりに、同期化された「ArrayList」を使用することをお勧めします。明らかに同じ利点があります。
また、ベクトルは時代遅れですか?も参照してください。
Vectorは同期リストの実装であり、Collections.synchronziedListは、任意のリスト実装の同期プロキシを作成するCollectionsユーティリティクラスのメソッドです。