Zenn
🙌

Java Silver 強化①コレクションList

2025/03/28に公開

1. Listインタフェース

List インタフェースは、順序付きのコレクションを表します。リスト内の要素にはインデックスがあり、要素の順序が保持されます。また、List インタフェースを実装するクラスでは、重複を許可することができます。

主なメソッドは次の通りです:

  • add(E e):リストの末尾に要素を追加する
  • get(int index):指定したインデックスの要素を取得する
  • set(int index, E element):指定したインデックスの要素を変更する
  • remove(int index):指定したインデックスの要素を削除する
  • clear():リストのすべての要素を削除
  • size():リストの要素数を返す
  • contains(Object o):リストに指定した要素が含まれているかどうかを確認する

2. ArrayListクラス

ArrayList クラスは、List インタフェースを実装した最も一般的なクラスの1つです。内部的には動的配列を使用して要素を管理します。そのため、要素をインデックスでランダムにアクセスするのに非常に高速です。

特徴:

  • サイズの自動拡張: 配列と異なり、ArrayList は要素が追加されるたびに自動でサイズを拡張します。
  • 順序を保持: ArrayList は挿入順序を保持し、インデックスで要素を取得できます。
  • 高速なランダムアクセス: 要素のインデックスによるアクセスは非常に高速です。
  • 追加・削除: 要素の追加や削除は比較的簡単ですが、要素を削除する際に配列の要素をシフトさせるため、場合によっては遅くなることがあります。

例:ListArrayList の使用例

import java.util.List;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Listインタフェースの宣言
        List<String> list = new ArrayList<>();
        
        // 要素の追加
        list.add("りんご");
        list.add("バナナ");
        list.add("みかん");
        
        // 要素の取得
        System.out.println(list.get(1)); // バナナ

        // 要素の削除
        list.remove(2); // みかんを削除

        // 要素数の表示
        System.out.println("リストのサイズ: " + list.size()); // 2

        // リスト内の要素をループで表示
        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

3. LinkedListクラス

LinkedList クラスは、List インタフェースを実装するもう一つの代表的なクラスで、内部的には双方向リンクリスト(Linked List)を使用して要素を管理します。LinkedList は要素の追加や削除が高速で、特にリストの先頭や末尾への操作に優れています。

特徴:

  • 要素の挿入・削除が高速: リストの先頭または末尾での挿入や削除は非常に高速です。
  • インデックスアクセスは遅い: 要素にインデックスでアクセスする際には、リストを順番に探索する必要があり、ArrayList よりもパフォーマンスが劣ることがあります。
  • メモリ使用量が大きい: 各要素が前後のリンクを保持しているため、ArrayList よりもメモリを多く消費します。

例:LinkedList の使用例

import java.util.List;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        // Listインタフェースの宣言
        List<String> list = new LinkedList<>();
        
        // 要素の追加
        list.add("りんご");
        list.add("バナナ");
        list.add("みかん");

        // 要素の追加(先頭に追加)
        list.add(0, "オレンジ");

        // 要素の取得
        System.out.println(list.get(2)); // バナナ

        // 要素の削除
        list.remove("みかん"); // みかんを削除

        // 要素数の表示
        System.out.println("リストのサイズ: " + list.size()); // 3

        // リスト内の要素をループで表示
        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

LinkedList の使用シナリオ

  • 頻繁に挿入・削除が行われる場合:特にリストの先頭や末尾に要素を追加・削除する際、LinkedList の方がパフォーマンスが良いです。
  • ランダムアクセスが少ない場合:要素にインデックスでアクセスする頻度が低ければ、LinkedList を選ぶことも有効です。

ArrayList と LinkedList の比較

特徴 ArrayList LinkedList
要素の挿入 末尾への挿入が高速、途中挿入は遅い 先頭・末尾への挿入は高速、途中挿入も比較的高速
要素の削除 中央や末尾での削除は遅い 先頭・末尾での削除は高速、中央の削除も比較的高速
インデックスアクセス 高速 遅い(リストを順番に探索する必要あり)
メモリ使用量 比較的少ない 各要素が前後のリンクを持つため多い
用途 ランダムアクセスが頻繁な場合 頻繁な挿入・削除が求められる場合

Discussion

ログインするとコメントできます