020 コレクションフレームワーク(List) 002 解答例

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        // ArrayList: 先頭に新しい要素 "Cherry" を追加
        ArrayList<String> colorsArrayList = new ArrayList<>(Arrays.asList("Red", "Green", "Blue"));
        colorsArrayList.add(0, "Cherry");

        // リストの表示
        System.out.println("ArrayList: " + colorsArrayList);

        // LinkedList: 先頭に新しい要素 "Cherry" を追加
        LinkedList<String> colorsLinkedList = new LinkedList<>(Arrays.asList("Red", "Green", "Blue"));
        colorsLinkedList.addFirst("Cherry");

        // リストの表示
        System.out.println("LinkedList: " + colorsLinkedList);
    }
}
  1. ArrayList:
    • add(0, "Cherry") を使用して、インデックス0(先頭)に新しい要素 “Cherry” を追加します。
    • add メソッドの第一引数には挿入する位置のインデックスを指定します。
    • リストの内容を表示すると、["Cherry", "Red", "Green", "Blue"] となります。
  2. LinkedList:
    • addFirst("Cherry") を使用して、先頭に新しい要素 “Cherry” を追加します。
    • addFirst メソッドは、リンクドリストの先頭に要素を追加します。
    • リストの内容を表示すると、["Cherry", "Red", "Green", "Blue"] となります。

これにより、それぞれのリストが要素 “Cherry” が先頭に追加された状態で表示されます。リストの実装による違いが現れています。 ArrayList は要素を指定した位置に挿入するのに対し、 LinkedList は先頭に要素を追加するメソッドが用意されています。

ArrayListとLinkedListの違い

ArrayListLinkedList は、Javaのコレクションフレームワークにおいてリストを実装するためのクラスでありながら、内部のデータ構造や操作の特性が異なります。以下に、主な違いについて解説します。

1. 内部データ構造:

  • ArrayList:
    • 内部では動的配列(Dynamic Array)を使用して要素を格納します。
    • インデックスに基づくランダムアクセスが高速で、要素の取得が効率的です。
  • LinkedList:
    • 内部では双方向リンクリスト(Doubly Linked List)を使用して要素を格納します。
    • 要素へのアクセスは前後のノードを辿る必要があり、ランダムアクセスよりも遅い場合があります。

2. 挿入と削除の効率:

  • ArrayList:
    • 中間への挿入や削除が遅い場合があります。挿入や削除に際して、要素の移動が必要です。
    • リストの末尾への要素の追加は比較的高速です。
  • LinkedList:
    • 中間への挿入や削除が効率的で、特に先頭や中間への要素の追加・削除が高速です。
    • 要素の前後への参照があるため、要素の移動が不要です。

3. ランダムアクセスと検索の効率:

  • ArrayList:
    • インデックスを使用したランダムアクセスが速く、検索が効率的です。
    • インデックスを指定することで直接アクセスできます。
  • LinkedList:
    • ランダムアクセスが遅く、検索も遅い傾向があります。
    • 要素に順番にアクセスする必要があるため、効率が低下します。

4. メモリ使用量:

  • ArrayList:
    • 要素の追加には一定のサイズの領域を確保しますが、必要な分だけではなく、余分な領域を確保することがあります。
  • LinkedList:
    • 各要素が次と前のノードへの参照を保持するため、メモリ使用量が ArrayList よりも多くなりがちです。

5. 使用ケース:

  • ArrayList:
    • 要素のランダムアクセスが頻繁に行われる場合や、読み取り操作が多い場合に適しています。
    • リストのサイズが動的に変動しない場合にも適しています。
  • LinkedList:
    • 要素の挿入や削除が頻繁に行われる場合や、大きなデータセットに対して柔軟な操作が必要な場合に適しています。
    • サイズが頻繁に変動する場合にも適しています。

状況によって選択されるべきであり、どちらが優れているかは使用ケースに依存します。ArrayList はランダムアクセスが速く、メモリ使用量が少ない一方で、LinkedList は挿入や削除が効率的です。使用する際には、それぞれの特性を理解して、タスクに最適なデータ構造を選択することが重要です。


ArrayListとLinkedListは、それぞれ異なる利点と特性を持つデータ構造であり、どちらを選択するかは具体的な使用ケースに依存します。ArrayListはランダムアクセスが速く、メモリ使用量が抑えられる一方で、LinkedListは挿入や削除が効率的で柔軟な操作が可能です。

プログラムの要件やデータアクセスパターンによって最適な選択が異なります。効率的なデータ操作を追求する際には、それぞれの特性を理解し、適切に利用することが重要です。ArrayListとLinkedListはJavaのコレクションフレームワークにおいてリストを実現する優れた手段であり、プログラマが適切に選択し活用することで、より効率的なアプリケーションを構築できるでしょう。

「020 コレクションフレームワーク」問題集リスト