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


352

2つのデータ構造体ArrayListVectorの違いは何ですか?それぞれをどこで使用する必要がありますか?


5
ここには正確な重複はありません。
ジェフアトウッド

2
まあ、Javaでもベクターを作成できます Vector v = new Vector(3, 2);
sgsi

絶対に使用しないでくださいVector、使用しArrayListたりLinkedListまたはArrayDeque

回答:


365

違い

  • ベクトルは同期されますが、ArrayListは同期されません。
  • データ増加方法

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

同期

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

Collections.synchronizedList 通常、リストの作成時に使用され、リストへの偶発的な非同期アクセスを回避します。

参照

データの増加

内部的には、ArrayListとVectorはどちらも、配列を使用してコンテンツを保持します。要素がArrayListまたはVectorに挿入されたとき、オブジェクトが領域を使い果たした場合、オブジェクトは内部配列を拡張する必要があります。Vectorはデフォルトで配列のサイズを2倍にしますが、ArrayListは配列のサイズを50%増やします。

参照


7
@Reiは、まさに彼は言った:複数のスレッドdocs.oracle.com/javase/tutorial/essential/concurrency/...
RecursiveExceptionException

マルチスレッド化された方法でArrayListからの読み取りについてはどうですか?それはスレッドセーフですか?
Xunie

@Xunie ArrayListまたは他のコレクションクラスからの読み取りは問題になりません。この問題は、ArrayListまたはコレクションの既存の値を追加、削除、または変更するときに発生します。
sainath reddy 2016

85

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


53

Vector壊れているクラスではないスレッドセーフは、それが「同期」しているとされるにもかかわらず、唯一の学生や他の経験の浅いプログラマが使用します。

ArrayList 専門家や経験豊富なプログラマーが使用する頼りになるリストの実装です。

スレッドセーフなリスト実装を希望する専門家はを使用しCopyOnWriteArrayListます。


10
同期されていますがスレッドセーフではありませんか?どういう意味ですか?[私は初心者です]
Dineshkumar 2013年

13
@Dineshkumar Vectorはスレッドセーフであることが意図されてましたが、実際にはスレッドセーフではないという設計上の欠陥があります。これは基本的に非推奨のクラスです。何らかの理由で、大学などはこのニュースについて聞いていないが、それでもその使用を主張している。
ボヘミアン

1
@Dineshkumar この
ボヘミアン

3
@Dineshkumar申し訳ありません-それは良いリンクではありませんでした。ここに決定的な答えがあります。つまり、その同期は役に立ちません。
ボヘミアン

7
面白い事実:Java1.7のスタックはVectorクラスを使用します。
Tobi

26

ArrayList より新しく、20〜30%高速です。

で明白に明らかなものが必要ない場合はVectorArrayList


32
証拠を提出することで主張を支持できます20-30% fasterか?
ユーザー

5
@user当時、それは巨大なアレイをまとまってからの個人的な経験でした。今から3年間、私が話していたことを正確に指摘することはできませんが、そこには多くのベンチマークがあります。それはあなたが最大のジャンプを見スレッドまでではないのですが、ここにあります1:javacodegeeks.com/2010/08/...
オリ

成長関数が最大の影響を与えるため、20/30%が一致するのは、Vector / Arraylistに対して読み取りと書き込みを行う場合のみです。一度だけ書き込み、次に読み取りのみを実行するベンチマークがある場合、別の結果になります
Tobi

2
データに証拠を提供してください
Wiredmark

ベクトルが同期され、arraylistが同期されていないため、それが理由である可能性があります。arraylistはベクトルよりも高速です。
ASK

23

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

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

  2. 新しい要素にスペースが足りない場合、ArrayListは以前のサイズの50%増加します。一方、新しい入力要素にスペースがない場合、Vectorは以前のサイズの100%増加します。

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

  1. Vectorから特定の位置にある要素を取得するには、elementAt(intインデックス)関数を使用します。この関数名は非常に長いです。これの代わりに、ArrayListにはget(int index)があり、覚えて使用するのが非常に簡単です。
  2. 同様に、既存の要素をVectorの新しい要素で置き換えるには、setElementAt()メソッドを使用します。これも非常に時間がかかり、プログラマが繰り返し使用するのを苛立たせる可能性があります。このArrayListの代わりに、使いやすく覚えやすいadd(int index、object)メソッドがあります。このように、彼らはArrayListでよりプログラマーフレンドリーで使いやすい関数名を持っています。

いつ使用するのですか?

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

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

それが役に立てば幸い。


5
ArrayLIstとVectorのサイズ拡大に関する誤った情報(切り替え)、それ以外の場合は非常に良い答え。
Nenad Bulatovic、2015年

Vectorの増加は、必要なdocs.oracle.com/javase/7/docs/api/java/util/Vector.htmlで倍増していますが、ArrayListの場合、「成長ポリシーの詳細は、要素を追加すること以外に指定されていません。一定の償却時間コスト。」 docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Mohamed El-Nakib

メソッド名がそのメソッドの使用または非使用の基準になる方法がわかりません。
Surender Kherwa

14

ArrayListそして、Vectorの両方を実装Listインタフェースは、挿入を維持order.Butの間に多くの違いがあるArrayListVectorクラスは...

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. VectorEnumerationインターフェイスを使用して要素をトラバースします。ただし、イテレータも使用できます。

参照:https : //www.javatpoint.com/difference-between-arraylist-and-vector


10

基本的に、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は、ベクターがオーバーフローしたときに容量が増加する量であるため、負荷係数をより詳細に制御できます。

その他の違いは次のとおりです。 ここに画像の説明を入力してください


1
LinkedListで最初と最後にオブジェクトを追加するのが遅いのはなぜですか?arrayListとvectorのどちらよりも高速ではないですか?
CHANist

@CHANist私も同意します。最初と最後にオブジェクトを追加する方が、途中にオブジェクトを追加するよりも高速です。
Rahul Rastogi、

1
この表のLinkedList列で使用されている言語は矛盾しています。LinkedListの前置と追加の両方は、途中で要素を追加するよりも高速ですが、ArrayListまたはVectorの前置または追加よりは低速です。これは、挿入するたびにローカル以外の参照でメモリを割り当てる必要があり、キャッシュミスの可能性が高くなるためです。LinkedListでのルックアップは要素の数に比例し、末尾へのポインタは保存されませんが、メモリは1つの要素にのみ再割り当てされるため、追加は前に追加するよりも高速です。
ソフィアゴールド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.