この記事の要点
• ArrayList は要素数を自動的に増やせる可変長配列
• `ArrayList<型>` でジェネリクスを使い、型を指定する
• `add()` / `get()` / `set()` / `remove()` が基本操作
ArrayList とは
通常の配列(int[] など)はサイズ固定で、宣言時に要素数を決める必要があります。後から増やしたり減らしたりできません。
ArrayList は java.util.ArrayList クラスで提供される、可変長の配列(リスト) です。要素を自由に追加・削除でき、サイズが自動調整されます。
| 特徴 | 説明 |
|---|---|
| サイズ自動調整 | add() で要素を追加すると自動的に伸びる |
| 型安全 | ジェネリクス(<型>)で扱う型を指定 |
| 豊富なメソッド | contains() / indexOf() / clear() など便利な操作が揃う |
配列との違い
| 項目 | 通常の配列 | ArrayList |
|---|---|---|
| サイズ | 固定(宣言時に決定) | 可変(自動伸長) |
| 型 | プリミティブ型 OK(int[]) | オブジェクト型のみ(ArrayList<Integer>) |
| 書き方 | arr[0] = 10; | list.set(0, 10); |
| 読み方 | arr[0] | list.get(0) |
| 長さ確認 | arr.length | list.size() |
| 初期化の簡潔さ | {1, 2, 3} で初期化可 | Arrays.asList() や List.of() を使う |
ポイント: プリミティブ型(int, double など)を扱いたい場合は、ラッパークラス(Integer, Double)を使います。例: `ArrayList<Integer>`
基本的な使い方
1. import
import java.util.ArrayList;
2. ArrayList の宣言と生成
// Java 21
ArrayList<String> names = new ArrayList<>();
<String> の部分がジェネリクスです。「このリストは String 型の要素を扱う」という意味です。
補足: `new ArrayList<>()` の `<>` は**ダイヤモンド演算子**と呼ばれ、型推論で右辺の型を省略できます(Java 7 以降)。
3. 要素を追加する(add)
names.add("Alice");
names.add("Bob");
names.add("Charlie");
リストの末尾に順次追加されます。
4. 要素を取得する(get)
String first = names.get(0); // Alice
String second = names.get(1); // Bob
インデックスは0始まりです。
5. 要素数を確認する(size)
int count = names.size(); // 3
6. 要素を削除する(remove)
names.remove(1); // インデックス 1(Bob)を削除
// names は ["Alice", "Charlie"] になる
または、値を指定して削除:
names.remove("Alice"); // "Alice" を削除
主要メソッド一覧
| メソッド | 説明 | 戻り値 |
|---|---|---|
add(E element) | 末尾に要素を追加 | boolean |
add(int index, E element) | 指定位置に挿入 | void |
get(int index) | 指定位置の要素を取得 | E |
set(int index, E element) | 指定位置の要素を上書き | E(元の値) |
remove(int index) | 指定位置の要素を削除 | E(削除した値) |
remove(Object o) | 指定値を削除(最初の1件) | boolean |
size() | 要素数を返す | int |
isEmpty() | 空かどうか | boolean |
contains(Object o) | 要素が含まれるか | boolean |
indexOf(Object o) | 要素の位置を返す(見つからない場合 -1) | int |
clear() | 全要素を削除 | void |
注意: `get(index)` や `remove(index)` で存在しないインデックスを指定すると `IndexOutOfBoundsException` が発生します。
ジェネリクスの基本
ジェネリクス(Generics) は「型をパラメータ化する」仕組みです。ArrayList<String> なら「String 型のリスト」という意味になります。
| 型 | 意味 |
|---|---|
ArrayList<String> | String のリスト |
ArrayList<Integer> | Integer のリスト |
ArrayList<Person> | Person クラスのリスト |
プリミティブ型は使えないので、ラッパークラスを使います。
| プリミティブ型 | ラッパークラス |
|---|---|
int | Integer |
double | Double |
boolean | Boolean |
char | Character |
例:
// Java 21
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
int first = numbers.get(0); // 10(自動アンボクシング)
補足: `numbers.add(10)` のように `int` を渡すと、自動的に `Integer` に変換されます(オートボクシング)。逆に `int first = numbers.get(0)` は自動アンボクシングされます。
拡張 for 文で走査する
ArrayList の全要素を順番に処理するには拡張 for 文が便利です。
// Java 21
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
for (String fruit : fruits) {
System.out.println(fruit);
}
出力:
Apple
Banana
Cherry
ポイント: インデックスを使わず、要素を直接取り出せます。読み取り専用の処理に向いています。
実践例: 学生の成績管理
// Java 21
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> scores = new ArrayList<>();
// 成績を追加
scores.add(85);
scores.add(92);
scores.add(78);
scores.add(90);
// 全成績を表示
System.out.println("成績一覧:");
for (int score : scores) {
System.out.println(score + "点");
}
// 平均点を計算
int sum = 0;
for (int score : scores) {
sum += score;
}
double average = (double) sum / scores.size();
System.out.printf("平均点: %.1f点%n", average);
// 90点以上の成績を抽出
System.out.println("\n90点以上の成績:");
for (int score : scores) {
if (score >= 90) {
System.out.println(score + "点");
}
}
}
}
出力:
成績一覧:
85点
92点
78点
90点
平均点: 86.2点
90点以上の成績:
92点
90点
contains() と indexOf() の活用
特定の要素が含まれているか調べたり、位置を調べたりできます。
// Java 21
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> members = new ArrayList<>();
members.add("Alice");
members.add("Bob");
members.add("Charlie");
// 要素が含まれるか
if (members.contains("Bob")) {
System.out.println("Bob はメンバーです");
}
// 要素の位置を調べる
int index = members.indexOf("Charlie");
if (index != -1) {
System.out.println("Charlie のインデックス: " + index); // 2
}
// 存在しない要素
int notFound = members.indexOf("David");
System.out.println("David のインデックス: " + notFound); // -1
}
}
補足: `indexOf()` は見つからない場合 `-1` を返すので、必ず `-1` チェックをしましょう。
ArrayList の内部動作(補足)
ArrayList は内部で配列を持ち、要素が増えると自動的に配列を拡張します。
| 操作 | 計算量(平均) | 備考 |
|---|---|---|
add(E) 末尾追加 | O(1) | 容量不足なら O(n) で再確保 |
add(int, E) 挿入 | O(n) | 後ろの要素をずらす必要がある |
get(int) 取得 | O(1) | インデックス直接アクセス |
remove(int) 削除 | O(n) | 後ろの要素を詰める |
contains(Object) 検索 | O(n) | 全要素を線形探索 |
注意: 大量の挿入・削除を繰り返す場合、`LinkedList` の方が効率的なケースもあります(応用)。
まとめ
| 概念 | 説明 |
|---|---|
| ArrayList | 可変長配列(リスト)を実現するクラス |
| ジェネリクス | <型> で扱う型を指定。型安全を保証 |
| add / get / set / remove | 基本的な追加・取得・更新・削除操作 |
| size / isEmpty / contains | 状態確認メソッド |
| 拡張 for 文 | 全要素を順番に処理する簡潔な記法 |
| ラッパークラス | プリミティブ型を扱うため Integer 等を使う |
次のステップ(シリーズ完結)
おめでとうございます! これで「Java入門」全15回が完結しました。ここまでで以下を学びました。
- 開発環境、基本構文、制御フロー(if / switch / for / while)
- 配列、メソッド、クラスとオブジェクト、コンストラクタ
- 標準入力(Scanner)、可変長配列(ArrayList)
さらに学ぶべきこと
Java の世界はここから先が本番です。次のステップとして:
| 分野 | 学習内容 | 用途 |
|---|---|---|
| コレクション応用 | HashMap, HashSet, LinkedList | データ構造の選択 |
| 例外処理 | try-catch-finally, 独自例外の作成 | エラーハンドリング |
| ファイル入出力 | Files, BufferedReader, Path | データの永続化 |
| 継承とポリモーフィズム | extends, interface, 抽象クラス | オブジェクト指向設計 |
| ラムダ式とStream API | stream(), filter(), map() | 関数型プログラミング |
| Spring Boot | Web アプリケーション開発 | 実務で最も使われるフレームワーク |
| データベース連携 | JDBC, JPA, Hibernate | 永続化層の実装 |
| テスト | JUnit, Mockito | 品質保証 |
本サイトに今後 Spring Boot や Web 開発の入門記事が追加される予定です。定期的にチェックしてください。
ポイント: Java は巨大なエコシステムを持つ言語です。基礎をしっかり固めたら、実際に Web アプリや API を作ってみることで理解が深まります。
参考リソース
- Oracle ArrayList API ドキュメント — 公式リファレンス
- Oracle Collections Framework Tutorial — コレクション全般の公式ガイド
- Effective Java (Joshua Bloch) — Java のベストプラクティス集
- Spring Boot 公式 — 次のステップへ