1. ホーム
  2. java

[解決済み] なぜJavaのVector(およびStack)クラスは時代遅れ、または非推奨とされているのですか?

2022-03-14 17:03:01

質問

なぜJava Vectorはレガシークラス、時代遅れ、非推奨とされているのですか?

並行処理を行う場合、その使用は有効ではないのですか?

また、手動でオブジェクトを同期させることなく、単にスレッドセーフなコレクションを使用したいだけで、基盤となる配列の新しいコピーを作成する必要がない場合(たとえば CopyOnWriteArrayList を使うのは問題ないのでしょうか? Vector ?

はどうでしょうか? Stack のサブクラスである Vector その代わりに何を使えばいいのでしょうか?

どのように解決するのですか?

Vector は、個々の操作で同期をとります。これは、ほとんどの場合、やりたいことではありません。

一般的に シーケンス全体 の操作です。個々の操作を同期させることは、安全性に欠けます。 Vector 例えば、他の誰かが同時にコレクションを変更するのを避けるために、ロックを解除する必要があります。 ConcurrentModificationException が、より遅くなる(一度で十分なのに、なぜ何度もロックを解除するのか)のでしょうか?)

もちろん、必要ないときにもロックしてしまうというオーバーヘッドもあります。

基本的に、ほとんどの状況において、同期化には非常に欠陥のあるアプローチです。というのも ブライアン・ヘンク氏 のような呼び出しを使用してコレクションを装飾することができます。 Collections.synchronizedList - というのは Vector は、quot;resized array" コレクションの実装と "synchronize every operation" ビットの両方を組み合わせたもので、これも設計が悪い例です。

については Stack に相当するもので、私なら Deque / ArrayDeque を開始します。