Vector クラスと ArrayDeque クラスの違いは何ですか? 昨日、ArrayDeque クラスについて読みましたが、以前は Vector クラスを使用していました。
3 に答える
基本は次のとおりです。
Vector
java.util.List
要素へのインデックスベースのアクセスを許可するコンテナーを定義するimplements 。また、 も実装interface RandomAccess
します。これは、基になる表現によって要素への高速な (通常はO(1)
) アクセスが可能であることをユーザーに示します。
ArrayDeque
コンテナの最初と最後からの素早い要素の追加と削除をサポートjava.util.Deque
するコンテナを定義します。
主な違い:
Vector
List.add(int index, E element)
またはのオーバーロードされたバージョンを使用して、コンテナの中央に要素を追加することをサポートしますList.addAll(int index, Collection<? extends E> c)
。Vector
remove
メソッドを使用して、コンテナの中央から要素を削除することをサポートしています。Vector
とメソッドを使用するset
とsetElementAt
、インプレース要素スワップ ( 内の 1 つのオブジェクトVector
を別のオブジェクトに置き換えるO(1)
操作) を実行できます。add
a の最後までのVector
時間は一定時間償却されます。ベクトルの先頭または中間への加算は線形時間操作です (O(n)
)。ArrayDeque
O(1)
コンテナの前面と背面の両方で要素の追加/削除を一定時間 ( ) 償却しました。ArrayDeque
コンテナ内の特定の位置にある要素を明確に削除することはできません。クラスのさまざまなremove
、removeFirst
、およびremoveLast
メソッドを使用すると、わずかに制限された要素を削除できます。ArrayDeque
peek
キュー ( 、poll
、add
、addFirst
) とスタック (offer
、push
、pop
、 )、またはその両方のようpeekLast
にクラスを使用するためのメソッドが付属していますaddLast
(したがって、それがDouble-Ended Queueである理由)。ArrayDeque
両端キューの途中に要素を追加することはサポートされていません。Vector
には、コンテナ内の特定の場所から開始するイテレータを取得できる特別な がListIterator
あり、要素の追加、削除、および設定もサポートしています。ArrayDeque
の反復子は、これらの余分なメソッドをサポートしていません。Vector
は同期コンテナーです。つまり、マルチスレッド環境で同期/ロックを実行するコードが既に含まれています。の場合ArrayDeque
、コンテナへのマルチスレッド アクセスを行う場合は、独自の同期コードを提供する必要があります。ArrayList
は の非同期版であることに注意してくださいVector
。
いくつかの違い:
- Vector はインターフェイスを実装し
List
ますが、ArrayDeque はQueue
インターフェイスを実装します。これらは異なるインターフェースであり、異なる一連の操作を提供します。Vector は通常のコンテナーですが、など*Queue
のメソッドがあるため、マルチスレッド アプリケーション (プロデューサー/コンシューマー パターン) 向けです。poll
offer
- ベクトル スレッド セーフ (同期機能が組み込まれています)、ArrayDeque はスレッド セーフではありません。
- バージョン 1.0 以降の JDK に含まれる Vector、バージョン 1.6 以降の ArrayDeque。
Oracle のドキュメントによると、Vector と Stack はレガシー クラスであり、代わりに Arraylist と ArrayDeque を使用する必要があります。 https://docs.oracle.com/javase/tutorial/collections/implementations/index.html https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.htmlは「(これはclass は、非同期であることを除いて、Vector とほぼ同じです。)"