1. ホーム
  2. Java

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ツールクラスを使用して、コレクションをスレッドセーフなコレクションにラップすることを考慮することができる。