Java での Vector と ArrayList の比較
ArrayList と Vector は、パッケージ collection< / span>とVectorとArrayListの違いは非常によく聞かれる質問です。これは単純な質問ですが、特に大規模なプロジェクトで作業している場合は、Vector と ArrayList のどちらを使用するかを知っておくことが重要です。この記事では、Java の Vector と ArrayList の違い点を見て、それらの違いの背後にある概念を理解しようとします。
Vector と Vector の違いを説明する前にと ArrayList では、これら 2 つの類似点を見てみましょう。
- Vector と ArrayList は拡張可能なストレージ構造を使用します。
- ArrayList と Vector は内部配列構造体を使用します。
- どちらのリストでも、要素が挿入される順序が維持されます。つまり、ArrayList または Vector を参照すると、挿入された順序でオブジェクトを取得できます。
- Vector と ArrayList では、重複する要素と null 値が許可されます。
- Iterator と Vector と ArrayList によって返される listIterator は fail-fast.
Vector と ArrayList
1) Synchronization
ArrayList は同期されていないため、複数のスレッドが同時にアクセスできます。たとえば、あるスレッドが ArrayList で追加操作を実行している場合、別のスレッドが非同期マルチスレッド環境で並列削除操作を実行している可能性があります。
Vector は同期されます。これにより、並行マルチスレッド環境でのスレッドの安全な使用が保証されます。例えば、あるスレッドが Vector で操作を実行している場合、最初のスレッドが終了するまで、他のスレッドはそのスレッドにアクセスできません。ArrayList とは異なり、一度に 1 つのスレッドしか操作を実行できません。
2) パフォーマンス
ArrayList は非同期であるため、パフォーマンスと速度が向上し、シングルスレッド環境で非常に適しています。スレッドが ArrayList の値を読み取るだけの場合は、マルチスレッド環境で ArrayList を使用することもできます.
Vector は同期されているため、同期の代償を払うため、速度が低下し、パフォーマンスが低下します。操作を実行するスレッドは、他のスレッドへのアクセスをブロックするため、ロックが解放されるまで待機します。
Vector は同期されているため、同期の代償を払うため、速度が低下し、パフォーマンスが低下します。操作を実行するスレッドは、他のスレッドへのアクセスをブロックするため、ロックが解放されるまで待機します。
両方のリストのストレージ容量は拡張可能または縮小的です。 Java設計者は、最適なストレージ使用量を維持するために動的にしました。ただし、それぞれに独自の方法があります。ArrayList はサイズの半分に拡大し、Vector は既定のサイズの 2 倍になります。ArrayListの容量は、メソッドensureCapacity().
4) fail-fast
まず、フェイルファストとは何かを理解しましょう:イテレータの追加および削除操作を除いてコレクション(ArrayList、Vectorなど)が変更された場合、イテレータの作成後にイテレータは例外ConcurrentModificationExceptionです。構造の変更は、コレクションの項目の追加または削除に関連しています。
Vector は、elements() は失敗しません。一方、ArrayList によって返される Iterator と ListIterator はフェイルファストです
5) コレクションフレームワークに実際に属しているのは誰ですか?
Vector は JDK 1.0 で登場したクラスの 1 つで、当初はコレクション フレームワークの一部ではありませんでしたが、最新バージョンでは List インターフェイスを実装しているため、考慮されています。
ArrayList フレームワークは、JDK 1.2 のリリースで Vector の後に導入されました。ArrayListはVectorよりも高度でしたが、Vectorのすべての仕様も備えていました。そのため、人々は Vector の代わりに ArrayList を使い始め、この場合、Vector はレガシークラスになりました。
同期操作は非同期操作に比べて多くの時間を消費するため、アプリケーションを高速に実行する必要があり、同期を必要としない場合は、パフォーマンスの点で ArrayList が適切な選択です。
この表は、これまでに確認された 5 つの違いをまとめたものです。
4) fail-fast
まず、フェイルファストとは何かを理解しましょう:イテレータの追加および削除操作を除いてコレクション(ArrayList、Vectorなど)が変更された場合、イテレータの作成後にイテレータは例外ConcurrentModificationExceptionです。構造の変更は、コレクションの項目の追加または削除に関連しています。
Vector は、elements() は失敗しません。一方、ArrayList によって返される Iterator と ListIterator はフェイルファストです
5) コレクションフレームワークに実際に属しているのは誰ですか?
Vector は JDK 1.0 で登場したクラスの 1 つで、当初はコレクション フレームワークの一部ではありませんでしたが、最新バージョンでは List インターフェイスを実装しているため、考慮されています。
ArrayList フレームワークは、JDK 1.2 のリリースで Vector の後に導入されました。ArrayListはVectorよりも高度でしたが、Vectorのすべての仕様も備えていました。そのため、人々は Vector の代わりに ArrayList を使い始め、この場合、Vector はレガシークラスになりました。
Vector と ArrayList を使用するタイミング?
コードがプロセス (スレッド) の同期を行う場合は、一度に 1 つのスレッドのみがコレクションにアクセスすることを保証するため、Vector が最適です。同期操作は非同期操作に比べて多くの時間を消費するため、アプリケーションを高速に実行する必要があり、同期を必要としない場合は、パフォーマンスの点で ArrayList が適切な選択です。
この表は、これまでに確認された 5 つの違いをまとめたものです。
ArrayList | Vector |
---|---|
1) ArrayList が同期されていません。 | ベクターは同期されています |
2) 要素数が容量を超えると、ArrayListは現在のサイズの50%インクリメント | Vectorは100%に変化し、要素数が容量を超えると元のサイズの2倍になります |
3) ArrayListはJDK 1.2. | Vector は JDK 1.0 で導入されました |
4) ArrayList は同期されていないため高速です | Vector は同期されているため遅いです。競合環境では、最初のスレッドがアクセスを許可するまで、他のプロセスがアクセスできなくなります |
5) ArrayList は Iterator を使用して要素を反復処理します | Vector は Enumeration インターフェイスを使用して要素を反復処理しますが、 イテレータも使用できます |