Java上級(XLVI) ArrayList、Vector、LinkedListの類似点と相違点を簡単に説明できる。
2022-02-20 02:06:17
Collectionクラスの継承図は以下のようになります。
図からわかるように、LinkedList、ArrayList、ArrayDequeはすべてListインターフェイスを実装しています。主な違いは、実装が異なるため、異なる操作に対して異なる効率性を持っていることです。
-
ArrayListはサイズ変更可能な配列です。ArrayListに要素が追加されると、そのサイズは動的に大きくなります。ArrayListは本質的に配列なので、内部の要素にはgetやsetメソッドで直接アクセスできます。
-
リスト arrayList = new ArrayList();
上記のようにデフォルトのコンストラクタを使用した場合、初期容量は10に設定されます。ArrayListの要素が10個以上になると、メモリスペースが再割り当てされ、配列のサイズは16に成長します。変更回数をデバッグすることにより、動的な成長を確認することができます。10-> 16-> 25-> 38-> 58-> 88-& gt;... (成長率: len/2 + 1) -
LinkedListは2重にリンクされたテーブルで、要素を追加したり削除したりする際にArrayListよりも性能が良い。しかし、getとsetの点ではArrayListより弱い。
もちろん、これらの比較はデータや演算が多い場合であり、データや演算が少なければ比較の意味はありません。
- VectorはArrayListと似ていますが、強い同期性を持つクラスです。もしアプリケーションがスレッドセーフ(複数のスレッドで同じコレクション/オブジェクトを共有しない)であれば、ArrayListを使用する方が良い選択です。
-
VectorとArrayListは、要素が増えるとより多くのスペースを要求します。LinkedListはQueueインターフェースも実装しており、Listよりも以下のような多くのメソッドを提供しています。
offer()、peek()、poll()など。
注:ArrayListのデフォルトの初期サイズは非常に小さいので、データ量を予測できる場合はより大きな初期値を割り当てて、リサイズのオーバーヘッドを軽減するのがベストプラクティスです。
- LinkedListは、ArrayListやArrayDequeとは実装の仕組みが全く異なる。ArrayListとArrayDequeは内部でコレクションの要素を配列の形で保持しているので、コレクションの要素へのランダムアクセスは性能が良い。一方、LinkedListは内部でコレクションの要素をチェーンの形で保持しているので、コレクションの要素へのランダムアクセスは性能が悪いが、要素の挿入と削除(ポインタのアドレスを変更するだけ)は性能が優れている。
-
Listコレクションの要素を反復処理する必要がある場合、ArrayListやVectorコレクションではランダムアクセスメソッド(get)を、LinkedListコレクションではIteratorを使用すると、パフォーマンスが向上します。
Listコレクションのサイズを変更するために頻繁に挿入と削除の操作を行う必要がある場合は、ArrayListではなくLinkedListコレクションを使用すべきです。ArrayList、Vectorコレクションを使用すると、内部配列のサイズを頻繁に再割り当てする必要があり、LinkedListを使用した場合の数十倍の時間オーバーヘッドとなることが多く、より悪化しています。 - Listコレクションの要素に同時にアクセスする必要がある複数のスレッドがある場合、開発者はCollectionsツールクラスを使用して、コレクションをスレッドセーフなコレクションにラップすることを考慮することができる。
関連
-
Uncaught ReferenceError: は定義されていません。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
無効なメソッド宣言
-
-bash: java: コマンドが見つからない 解決方法
-
配列定数は初期化子でのみ使用可能です。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
Javaジェネリックの深い理解
-
javaの継承の基本的な実装
-
Prologでは、コンテンツは許可されていません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プロジェクトの依存関係を解決できない。
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
シェルコマンドやスクリプトのJavaコール
-
ジャバアレイ
-
maven レポート エラー 解決不可能な親POM
-
Java基礎編 - オブジェクト指向
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
switch case文のcaseの後の列挙定数は列挙型なし
-
MyBatisカスタムタイプハンドラ TypeHandler