1

Javaのベクトルを同期する必要がある理由を理解しようとしていました。私がグーグルで到達したところはどこでも、要素が同期されているため同期されているため、1つのスレッドがアクセスしているときに他のスレッドがアクセスするのをブロックすると彼らは言いました。しかし、私が本当に知りたいのは、なぜそうしなければならないのかということです。Java は、アクセスしている人々に任せておくべきでした。しかし、Java が vector にアクセスするすべての人に同期データ構造の使用を強制したのはなぜでしょうか? ArrayList を私の要件に使用できると言う人々に同意します。しかし、私のポイントは、そのベクトルが私に与えるものは何ですか??

レンガサミ・ラマヌジャム

4

6 に答える 6

10

歴史。

VectorJDK 1.0 の一部でした。ArrayListではなかった。デフォルトの同期はパフォーマンスの低下を意味することがわかったため、Java Collections API が登場したときに元に戻されました。

のメソッドを使用して必要なコレクションを同期することもできますjava.util.Collectionsが、それはあなたの選択です。

パッケージの一部であるコレクションにも注意する必要がありjava.util.concurrentます。コレクションへの同時アクセスは、慎重にコレオグラフィーする必要があります。

于 2012-07-01T14:13:58.973 に答える
2

しかし、私のポイントは、そのベクトルが私に何を与えるのかということです。

これは「レガシー」クラスです。

同期リストクラスが特に必要でない限り、Vector新しいコードを作成するときに何も提供されません。

しかし、Vector正当な理由で(まだ)そこにあります。その理由は、Java1.0およびJava1.1で動作するように記述された古いJavaコードを実行できるようにするため、またはJavaコレクションフレームワークを含まない一部のJavaMEプロファイルで実行できるようにするためです。そして、それを変更した場合、を使用するマルチスレッドのレガシーコードVectorが破損する可能性があるため、(まだ)同期する必要があります。

于 2012-07-01T14:21:51.207 に答える
1

アプリケーション コードで同期を使用する必要があることを示す次の例を考えてみましょう。

// BROKEN CODE, needs external synchronization
 // only add an element if the vector is empty
 if(vector.isEmpty())
     vector.add(anElement);

ベクトルを選ぶ理由 あなたが何をしているかに依存します

内部的には、ArrayList と Vector の両方が、Array を使用して内容を保持します。プログラムでいずれかを使用するときは、この事実に留意する必要があります。要素を ArrayList または Vector に挿入する場合、オブジェクトがスペースを使い果たした場合、オブジェクトはその内部配列を拡張する必要があります。Vector はデフォルトで配列のサイズを 2 倍にしますが、ArrayList は配列のサイズを 50% 増やします。これらのクラスの使用方法によっては、新しい要素を追加するときにパフォーマンスが大幅に低下する可能性があります。オブジェクトの初期容量を、プログラムが必要とする最大容量に設定することを常にお勧めします。容量を慎重に設定することで、後で内部配列のサイズを変更するために必要なペナルティを支払うことを避けることができます。データの量がわからないが、データの増加率がわかっている場合は、

于 2012-07-01T14:14:07.230 に答える
0

Vectorを同期させることは、そのJavaライブラリを作成する人々がそれを実装することを決定した方法です。ArrayListとVectorはどちらも配列として内部的に実装され、どちらも動的にサイズ変更されますが、VectorはcapacityIncrement現在の配列サイズの2倍であり、ArrayListの場合は現在のサイズの半分です。ベクトルは、他のスレッドがアクセスする前に他のスレッドがアクセスしているかどうかを確認する必要があるため、低速です。

同期されたリストデータ構造が必要な場合はsynchronizedList(List list)CollectionsAPIから使用するのが最適です。

于 2012-07-01T14:19:05.307 に答える
0

a を強制的に使用するVector必要はありません。s を使用しても問題ありませんArrayList

スレッドを使用する場合、同期されていれば問題ありません。あなたのアプリケーションがスレッド化を使用していない場合は、Vector.

于 2012-07-01T14:12:44.000 に答える