web-dev-qa-db-ja.com

ArrayListとVectorの違いは何ですか?

2つのデータ構造ArrayListVectorの違いは何ですか。それぞれどこで使うべきですか?

320
KushalP

違い

  • ベクトルは同期していますが、ArrayListsは同期していません。
  • データ増加方法

Vectorを使用するための特別な要件がない場合は、ArrayListsを使用してください。

同期

複数のスレッドが同時にArrayListにアクセスする場合は、リストを構造的または単純に要素を変更するコードブロックを外部で同期させる必要があります。構造的変更とは、リストへの要素の追加または削除を意味します。既存の要素の値を設定することは構造的な変更ではありません。

Collections.synchronizedListは通常、リストへの偶然の非同期アクセスを避けるためにリストの作成時に使用されます。

参考文献

データ増加

内部的には、ArrayListとVectorは両方とも、Arrayを使用して内容を保持します。要素がArrayListまたはVectorに挿入されたときに、オブジェクトの空き領域がなくなった場合は、そのオブジェクトの内部配列を拡張する必要があります。 Vectorはデフォルトで配列のサイズを2倍にしますが、ArrayListの配列サイズは50%増加します。

参考文献

338
Sev

ドキュメントにあるように、a VectorArrayList はほぼ同等です。違いは、Vectorへのアクセスは同期されていますが、ArrayListへのアクセスは同期されていないことです。これが意味するのは、一度に1つのスレッドだけがVectorのメソッドを呼び出せるということです、そしてロックを獲得することにわずかなオーバーヘッドがあります。 ArrayListを使用する場合、これは事実ではありません。一般的にはArrayListを使いたくなるでしょう。シングルスレッドの場合はより良い選択であり、マルチスレッドの場合はロックをより適切に制御できます。同時読み取りを許可しますか?いいですね。 10回の書き込みのバッチに対して1回の同期を実行したいですか。また大丈夫です。それはあなたの側でもう少し注意が必要ですが、それはおそらくあなたが望むものです。また、ArrayListがある場合は、 Collections.synchronizedList 関数を使用して同期リストを作成できるため、Vectorと同等のものが得られます。

80

Vector壊れた クラスで、「同期」されているにもかかわらず threadsafeではなく //]のみ学生や他の経験の浅いプログラマによって使用されます。

ArrayListは、専門家や経験豊富なプログラマが使用するGo-to Listの実装です。

スレッドセーフなリストの実装を望むプロフェッショナルは、 CopyOnWriteArrayList を使用します。

45
Bohemian

ArrayListは新しく、20-30%速くなりました。

Vectorに明示的に明らかなものが必要ない場合は、ArrayListを使用してください

26
Oli

VectorとArrayListには2つの大きな違いがあります。

  1. Vectorはデフォルトで同期され、ArrayListは同期されません。注:arraylistオブジェクトをCollections.synchronizedList()メソッドに渡すことで、ArrayListも同期させることができます。同期された手段:それはいかなる副作用もなしに複数のスレッドで使用することができます。

  2. 新しい要素に十分なスペースがない場合、ArrayListsは前のサイズの50%増加します。新しい入力要素用のスペースがない場合、Vectorは前のサイズの100%増加します。

これ以外にも、プログラミングの観点から、両者の間には実際的な違いがいくつかあります。

  1. Vectorから特定の位置にある要素を取得するには、elementAt(int index)関数を使用します。この関数名は非常に長いです。これの代わりにArrayListにはget(int index)があり、これは覚えやすく使いやすいものです。
  2. Vectorで既存の要素を新しい要素で置き換えるのと同じように、setElementAt()メソッドを使用します。 。このArrayListの代わりにadd(int index、object)メソッドがあり、使いやすく覚えやすいです。このように、彼らはよりプログラマに優しく、使いやすいArrayListの関数名を持っています。

どちらを使うのか

  1. ベクターを完全に使用しないようにしてください。 ArrayListsはVectorができることすべてをすることができます。配列リストはデフォルトでは同期されません。必要に応じて、必要に応じてCollections utilクラスを使用して同期することができます。
  2. ArrayListは関数名を覚えやすく使いやすいものにしています。

:arraylistが100%増加したとしても、初期段階で十分なメモリを割り当てていることを確認するためにsurecapacity()メソッドを使用するとこれを回避できます自体。

それが役に立てば幸い。

22
user1923551

ArrayListVectorは両方ともListインターフェースを実装し、挿入順序を維持します。ただし、ArrayListクラスとVectorクラスの間には多くの違いがあります...

ArrayList -

  1. ArrayListは同期されていません。
  2. ArrayListは、要素数がその容量を超えた場合、現在の配列サイズの50%を増分します。
  3. ArrayListはレガシークラスではなく、JDK 1.2で導入されました。
  4. ArrayListは非同期であるため高速です。
  5. ArrayListは、要素を走査するためにIteratorインターフェースを使用します。

ベクトル -

  1. Vectorは同期されています。
  2. Vectorが100%増加するということは、要素の総数がその容量を超える場合、配列サイズが2倍になることを意味します。
  3. Vectorはレガシクラスです。

  4. Vectorは同期化されているので低速です。つまり、マルチスレッド環境では、現在のスレッドがオブジェクトのロックを解放するまで、他のスレッドを実行可能または実行不可能な状態に保持します。

  5. Vectorは、Enumerationインターフェイスを使用して要素を走査します。しかし、それはまたイテレータを使うことができます。

関連項目: https://www.javatpoint.com/difference-between-arraylist-and-vector

13
roottraveller

基本的に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は、次の場合に容量が増加する量です。ベクトルはオーバーフローするので、負荷率をより細かく制御できます。

その他の違いは次のとおりです。 enter image description here

10
subhashis