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]
}
}
Java2. インデックスアクセス(ランダムアクセス)
String fruit = list.get(1); // インデックス1 → Banana
System.out.println(fruit);
Java3. 更新
list.set(1, "Blueberry"); // Banana → Blueberry
System.out.println(list); // [Apple, Blueberry, Cherry]
Java4. 削除
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.synchronizedListやCopyOnWriteArrayListを検討。
まとめ
- ArrayList は「一覧管理の定番」。
- ランダムアクセスが速いので、インデックスでの取得・更新に強い。
- 途中挿入・削除は遅いので、用途に応じて LinkedList と使い分ける。
👉 練習課題として「100人の名前を ArrayList に入れて、ランダムに10人を取得する」コードを書いてみると、ランダムアクセスの速さが体感できます。
