Java 逆引き集 | ArrayList の使いどころと性能(ランダムアクセス重視) — 一覧管理

Java Java
スポンサーリンク

ArrayList の使いどころと性能(ランダムアクセス重視) — 一覧管理

Java で「一覧管理」をする際によく使うのが ArrayList
初心者がまず理解すべきは「どんな場面で使うか」「性能の特徴」「コードの書き方」です。ここでは例題を交えて、かみ砕いて説明します。


ArrayList の特徴

  • 内部構造: 配列をベースにした可変長リスト。
  • ランダムアクセスが速い: インデックス指定での取得・更新は O(1)。
  • 追加: 末尾への追加は平均 O(1)。途中への挿入は O(n)。
  • 削除: 途中の要素削除は O(n)。末尾削除は O(1)。
  • 用途: 「順番付きの一覧を管理」「インデックスで素早くアクセス」したいときに最適。

基本コード例

1. 作成と追加

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        System.out.println(list); // [Apple, Banana, Cherry]
    }
}
Java

2. インデックスアクセス(ランダムアクセス)

String fruit = list.get(1); // インデックス1 → Banana
System.out.println(fruit);
Java

3. 更新

list.set(1, "Blueberry"); // Banana → Blueberry
System.out.println(list); // [Apple, Blueberry, Cherry]
Java

4. 削除

list.remove(0); // Apple を削除
System.out.println(list); // [Blueberry, Cherry]
Java

性能の考え方

操作計算量特徴
get(index)O(1)ランダムアクセスが速い
set(index, value)O(1)更新も速い
add(value)平均 O(1)末尾追加は効率的
add(index, value)O(n)途中挿入は遅い
remove(index)O(n)途中削除は遅い

👉 まとめ:

  • ランダムアクセス重視 → ArrayList
  • 頻繁な挿入・削除 → LinkedList

例題で練習

例題1: 学生名簿管理

ArrayList<String> students = new ArrayList<>();
students.add("Tanaka");
students.add("Sato");
students.add("Suzuki");

// ランダムアクセス
System.out.println(students.get(2)); // Suzuki

// 更新
students.set(1, "Kato");
System.out.println(students); // [Tanaka, Kato, Suzuki]
Java

例題2: 数値一覧の合計

ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);

int sum = 0;
for (int n : numbers) {
    sum += n;
}
System.out.println("合計=" + sum); // 合計=60
Java

例題3: 検索(線形探索)

String target = "Suzuki";
if (students.contains(target)) {
    System.out.println(target + " は名簿に存在します");
}
Java

テンプレート集

作成

ArrayList<Type> list = new ArrayList<>();
Java

追加

list.add(value);          // 末尾追加
list.add(index, value);   // 指定位置に挿入
Java

取得・更新

Type val = list.get(index);
list.set(index, newValue);
Java

削除

list.remove(index);
list.remove(value);
Java

検索

boolean exists = list.contains(value);
int idx = list.indexOf(value);
Java

実務でのコツ

  • サイズが増えると自動拡張: 内部配列が足りなくなると自動で大きくなる。
  • 初期容量を指定すると効率的: 大量データを扱う場合は new ArrayList<>(1000) のように初期容量を指定。
  • スレッド安全ではない: 複数スレッドで同時アクセスする場合は Collections.synchronizedListCopyOnWriteArrayList を検討。

まとめ

  • ArrayList は「一覧管理の定番」
  • ランダムアクセスが速いので、インデックスでの取得・更新に強い。
  • 途中挿入・削除は遅いので、用途に応じて LinkedList と使い分ける。

👉 練習課題として「100人の名前を ArrayList に入れて、ランダムに10人を取得する」コードを書いてみると、ランダムアクセスの速さが体感できます。

タイトルとURLをコピーしました