JavaのArrayListとVectorの違い

ArrayListとVectorの両方が内部的にデータ構造としてArrayを使用します。 ただし、データの保存方法と処理方法にはほとんど違いがありません。 この記事では、ArrayListとVectorの違いと類似点について説明します。

ArrayList Vs Vector:

1)同期:ArrayListは同期されていないため、複数のスレッドが同時にArrayListで動作することができます。 例えば、 あるスレッドがArrayListに対してadd操作を実行している場合、Vectorが同期されている間に、マルチスレッド環境

で同時にArrayListに対してremove操作を実行する別のスレッ これは、あるスレッドがVectorで作業している場合、他のスレッドはそれを保持できないことを意味します。 ArrayListとは異なり、vectorに対して一度に操作を実行できるスレッドは一つだけです。

2)サイズ変更:ArrayListとVectorの両方が、ストレージの最適な使用を維持するために動的に拡大および縮小できますが、サイズ変更の方法は異なります。 ArrayListはサイズを変更するとサイズの半分に拡大しますが、Vectorはサイズを変更するとデフォルトでそれ自身のサイズを倍にします。

3)パフォーマンス:ArrayListは同期されていないため、パフォーマンスが向上します。 Vector操作はスレッドセーフであるためパフォーマンスが低下し、Vectorで動作するスレッドはロックを取得し、ロックが解放されるまで他のスレッドを待機させます。

4)fail-fast:まずfail-fastとは何かを説明しましょう: コレクション(ArrayList、vectorなど)が、iteratorのaddまたはremoveメソッドを除いて、iteratorの作成後に構造的に変更された場合、iteratorはConcurrentModificationExceptionをスローします。 構造変更とは、コレクションからの要素の追加または削除を指します。

ベクトルjavadocごとに、Vectorによって返される列挙はフェイルファストではありません。 反対側では、ArrayListによって返されるiteratorとlistIteratorはフェイルファストです。

5)本当にcollection frameworkに属しているのは誰ですか? ベクトルはcollection frameworkの一部ではなく、後でコレクションに含まれています。 これはレガシーコードと見なすことができます。 リストコレクションができないVectorについては何もありません。 したがって、Vectorは避けるべきです。 スレッドセーフな操作が必要な場合は、この記事の次のセクションで説明したようにArrayListを同期させるか、Arraylistのスレッドセーフな変種であるCopyOnWriteArrayListを使用します。

これらのクラスの間には、次のような類似点はほとんどありません:

  1. VectorとArrayListの両方で、拡張可能な配列データ構造を使用します。
  2. これらのクラス(VectorおよびArrayList)によって返されるiteratorおよびlistIteratorはフェイルファストです。
  3. 要素の挿入順序を維持するため、両方とも順序付けられたコレクションクラスです。
  4. Vector&ArrayListは、重複値とnull値の両方を許可します。
  5. オーバーフローと削除が発生すると、それらは両方とも自動的に成長し、縮小します。

いつArrayListを使用し、いつvectorを使用するのですか?

それは完全に要件に依存します。 “スレッドセーフ”操作を実行する必要がある場合は、一度に1つのスレッドだけがコレクションにアクセスするようにするため、ベクトルが最善の策

パフォーマンス:同期された操作は、同期されていない操作に比べてより多くの時間を消費するため、スレッドセーフな操作が必要ない場合は、並行プロセ

どのようにArrayListを同期させるのですか?上記のように、ArrayListメソッドは同期されていませんが、必要がある場合は、次のように同期させることができます-

//Use Collecions.synzhonizedList methodList list = Collections.synchronizedList(new ArrayList());...//If you wanna use iterator on the synchronized list, use it//like this. It should be in synchronized block.synchronized (list) { Iterator iterator = list.iterator(); while (iterator.hasNext()) ... iterator.next(); ...}