2つのデータ構造ArrayListとVectorの違いは何ですか。それぞれどこで使うべきですか?
違い
Vectorを使用するための特別な要件がない場合は、ArrayListsを使用してください。
同期
複数のスレッドが同時にArrayListにアクセスする場合は、リストを構造的または単純に要素を変更するコードブロックを外部で同期させる必要があります。構造的変更とは、リストへの要素の追加または削除を意味します。既存の要素の値を設定することは構造的な変更ではありません。
Collections.synchronizedList
は通常、リストへの偶然の非同期アクセスを避けるためにリストの作成時に使用されます。
データ増加
内部的には、ArrayListとVectorは両方とも、Arrayを使用して内容を保持します。要素がArrayListまたはVectorに挿入されたときに、オブジェクトの空き領域がなくなった場合は、そのオブジェクトの内部配列を拡張する必要があります。 Vectorはデフォルトで配列のサイズを2倍にしますが、ArrayListの配列サイズは50%増加します。
ドキュメントにあるように、a Vector
と ArrayList
はほぼ同等です。違いは、Vector
へのアクセスは同期されていますが、ArrayList
へのアクセスは同期されていないことです。これが意味するのは、一度に1つのスレッドだけがVector
のメソッドを呼び出せるということです、そしてロックを獲得することにわずかなオーバーヘッドがあります。 ArrayList
を使用する場合、これは事実ではありません。一般的にはArrayList
を使いたくなるでしょう。シングルスレッドの場合はより良い選択であり、マルチスレッドの場合はロックをより適切に制御できます。同時読み取りを許可しますか?いいですね。 10回の書き込みのバッチに対して1回の同期を実行したいですか。また大丈夫です。それはあなたの側でもう少し注意が必要ですが、それはおそらくあなたが望むものです。また、ArrayListがある場合は、 Collections.synchronizedList
関数を使用して同期リストを作成できるため、Vector
と同等のものが得られます。
Vector
は 壊れた クラスで、「同期」されているにもかかわらず threadsafeではなく //]のみ学生や他の経験の浅いプログラマによって使用されます。
ArrayList
は、専門家や経験豊富なプログラマが使用するGo-to Listの実装です。
スレッドセーフなリストの実装を望むプロフェッショナルは、 CopyOnWriteArrayList
を使用します。
ArrayList
は新しく、20-30%速くなりました。
Vector
に明示的に明らかなものが必要ない場合は、ArrayList
を使用してください
VectorとArrayListには2つの大きな違いがあります。
Vectorはデフォルトで同期され、ArrayListは同期されません。注:arraylistオブジェクトをCollections.synchronizedList()メソッドに渡すことで、ArrayListも同期させることができます。同期された手段:それはいかなる副作用もなしに複数のスレッドで使用することができます。
新しい要素に十分なスペースがない場合、ArrayListsは前のサイズの50%増加します。新しい入力要素用のスペースがない場合、Vectorは前のサイズの100%増加します。
これ以外にも、プログラミングの観点から、両者の間には実際的な違いがいくつかあります。
どちらを使うのか
注:arraylistが100%増加したとしても、初期段階で十分なメモリを割り当てていることを確認するためにsurecapacity()メソッドを使用するとこれを回避できます自体。
それが役に立てば幸い。
ArrayList
とVector
は両方ともListインターフェースを実装し、挿入順序を維持します。ただし、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はどちらも内部Object Arrayを使用します。
ArrayList:ArrayListクラスはAbstractListを拡張し、ListインタフェースとRandomAccess(markerインタフェース)を実装します。 ArrayListは、必要に応じて拡大できる動的配列をサポートしています。それは私たちに要素の最初の反復を与えます。 ArrayListは内部オブジェクト配列を使用します。これらのサイズは、デフォルトの初期サイズ10で作成されます。このサイズを超えると、コレクションは自動的にデフォルトサイズの半分である15の半分に増えます。
Vector:VectorはArrayListに似ていますが、違いは同期されており、デフォルトの初期サイズは10で、サイズがサイズを超えると倍になります。 RandomAccessを実装するには、VectorがArrayList以外の唯一のクラスです。 Vectorは、そのうち4つのコンストラクタを持っていますVector(int initialCapacity、int capacityIncrement)capacityIncrementは、次の場合に容量が増加する量です。ベクトルはオーバーフローするので、負荷率をより細かく制御できます。
その他の違いは次のとおりです。