回答:
違い
Vectorを使用する特別な要件がない場合は、ArrayListを使用してください。
同期
複数のスレッドが同時にArrayListにアクセスする場合は、構造的にまたは単に要素を変更するだけでリストを変更するコードブロックを外部で同期する必要があります。構造変更とは、リストからの要素の追加または削除を意味します。既存の要素の値の設定は、構造的な変更ではありません。
Collections.synchronizedList
通常、リストの作成時に使用され、リストへの偶発的な非同期アクセスを回避します。
データの増加
内部的には、ArrayListとVectorはどちらも、配列を使用してコンテンツを保持します。要素がArrayListまたはVectorに挿入されたとき、オブジェクトが領域を使い果たした場合、オブジェクトは内部配列を拡張する必要があります。Vectorはデフォルトで配列のサイズを2倍にしますが、ArrayListは配列のサイズを50%増やします。
ドキュメントが言うように、a Vector
とan ArrayList
はほぼ同等です。違いは、へのアクセスVector
は同期されているのに対し、へのアクセスは同期されてArrayList
いないことです。つまり、一度に1つのスレッドのみがメソッドを呼び出すことができVector
、ロックの取得にはわずかなオーバーヘッドがあります。を使用する場合ArrayList
、これは当てはまりません。一般的には、を使用する必要がありArrayList
ます。シングルスレッドの場合はより良い選択であり、マルチスレッドの場合はロックをよりよく制御できます。同時読み取りを許可したいですか?いいよ 10回の書き込みのバッチに対して1つの同期を実行したいですか?またいい。それはあなたの側でもう少し注意が必要ですが、それはおそらくあなたが望むものです。また、ArrayListがある場合は、Collections.synchronizedList
同期リストを作成する関数Vector
。これにより、と同等のものが得られます。
Vector
で壊れているクラスではないスレッドセーフは、それが「同期」しているとされるにもかかわらず、唯一の学生や他の経験の浅いプログラマが使用します。
ArrayList
専門家や経験豊富なプログラマーが使用する頼りになるリストの実装です。
スレッドセーフなリスト実装を希望する専門家はを使用しCopyOnWriteArrayList
ます。
Vector
はスレッドセーフであることが意図されていましたが、実際にはスレッドセーフではないという設計上の欠陥があります。これは基本的に非推奨のクラスです。何らかの理由で、大学などはこのニュースについて聞いていないが、それでもその使用を主張している。
ArrayList
より新しく、20〜30%高速です。
で明白に明らかなものが必要ない場合はVector
、ArrayList
20-30% faster
か?
VectorとArrayListには2つの大きな違いがあります。
Vectorはデフォルトで同期されますが、ArrayListは同期されません。注:arraylistオブジェクトをCollections.synchronizedList()メソッドに渡すことにより、ArrayListも同期させることができます。同期の意味:副作用なしで複数のスレッドで使用できます。
新しい要素にスペースが足りない場合、ArrayListは以前のサイズの50%増加します。一方、新しい入力要素にスペースがない場合、Vectorは以前のサイズの100%増加します。
これ以外に、プログラミング作業の点で、それらの間にはいくつかの実際的な違いがあります。
いつ使用するのですか?
注:arraylistが100%増加しても、初期容量自体に十分なメモリを割り当てていることを確認するには、ensurecapacity()メソッドを使用してこれを回避できます。
それが役に立てば幸い。
ArrayList
そして、Vector
の両方を実装Listインタフェースは、挿入を維持order.Butの間に多くの違いがあるArrayList
とVector
クラスは...
ArrayList
同期されていません。ArrayList
要素の数がその容量を超えた場合、現在の配列サイズの50%を増分します。ArrayList
レガシークラスではなく、JDK 1.2で導入されました。ArrayList
非同期なので高速です。ArrayList
Iteratorインターフェイスを使用して要素をトラバースします。写真素材 -
Vector
同期されます。Vector
100%の増分は、要素の総数がその容量を超えた場合に配列サイズを2倍にすることを意味します。Vector
レガシークラスです。
Vector
マルチスレッド環境では同期されているため低速です。現在のスレッドがオブジェクトのロックを解放するまで、他のスレッドを実行可能状態または実行不能状態に保持します。
Vector
Enumerationインターフェイスを使用して要素をトラバースします。ただし、イテレータも使用できます。
参照:https : //www.javatpoint.com/difference-between-arraylist-and-vector
基本的に、ArrayListとVectorはどちらも内部オブジェクト配列を使用します。
ArrayList: ArrayListクラスはAbstractListを拡張し、ListインターフェースとRandomAccess(マーカーインターフェース)を実装します。ArrayListは、必要に応じて拡張できる動的配列をサポートしています。要素の最初の反復を行います。ArrayListは内部オブジェクト配列を使用します。これらはデフォルトの初期サイズ10で作成されます。このサイズを超えると、コレクションはデフォルトサイズの15の半分に自動的に増加します。
Vector: VectorはArrayListに似ていますが、違いがあり、同期され、デフォルトの初期サイズは10です。サイズがそのサイズを超えると、元のサイズの2倍に増加します。つまり、新しいサイズは20になります。ベクトルは唯一のクラスですRandomAccessを実装するためのArrayList以外。Vectorには4つのコンストラクターがあり、そのうちの1つは2つのパラメーターを取ります。Vector(int initialCapacity、int capacityIncrement) capacityIncrementは、ベクターがオーバーフローしたときに容量が増加する量であるため、負荷係数をより詳細に制御できます。
その他の違いは次のとおりです。