Java ArrayListの使い方完全ガイド|追加・削除・取得・検索の基本操作
生徒
「Javaで複数のデータをまとめて扱いたいとき、普通の配列だと後からサイズを変えられなくて困っています。何か便利な方法はありますか?」
先生
「それは良いところに気づきましたね。JavaにはArrayList(アレイリスト)という、データの数に合わせてサイズが自動的に変わる便利な仕組みがあるんですよ。」
生徒
「サイズが変わる配列、すごく便利そうですね!具体的にはどのように操作するのでしょうか?」
先生
「データの追加や削除、検索といった基本操作を覚えれば、プログラミングの幅がぐっと広がります。それでは、ArrayListの基礎からじっくり見ていきましょう!」
1. ArrayListとは?基本の仕組みを解説
Javaのプログラミングにおいて、非常によく使われるクラスの一つがArrayListです。ArrayListは「コレクションフレームワーク」と呼ばれる仕組みの中に含まれており、複数のデータ(オブジェクト)を一つのまとまりとして、順番に管理するためのクラスです。
最大の特徴は、通常の配列とは違い「動的配列」である点にあります。配列は作成時にサイズを決める必要があり、後から要素数を増やすことはできません。一方、ArrayListはデータを追加すると、自動的に内部のサイズが拡張されます。そのため、最初は少ないデータでも、必要に応じてどんどん追加できる柔軟さがあります。
また、ArrayListはデータの「順番」が必ず保持されます。つまり、追加した順にデータが並び、取り出すときも同じ順序になります。これは初心者にとって非常に分かりやすく、「箱に順番通りに物を入れて、同じ順番で取り出す」イメージを持つと理解しやすいでしょう。データの数が決まっていない場合や、増えたり減ったりする処理では、ArrayListは最初に覚えるべき重要なクラスです。
import java.util.ArrayList;
public class ArrayListIntroSample {
public static void main(String[] args) {
// ArrayListを作成(文字列を入れるリスト)
ArrayList<String> names = new ArrayList<>();
// データを追加
names.add("太郎");
names.add("花子");
// 中身を表示
System.out.println(names);
}
}
上のサンプルでは、ArrayListを使って名前のリストを作成しています。addメソッドでデータを追加するだけで、自動的にサイズが調整される点がポイントです。配列のように難しい初期設定が不要なため、プログラミング未経験者でも直感的に扱うことができます。
2. ArrayListの宣言とインスタンス生成
ArrayListを使用するには、まずプログラムの冒頭で「java.util.ArrayList」をインポートする必要があります。その後、どのような種類のデータを保存するかを指定してインスタンスを生成します。このデータ型の指定には「ジェネリクス(型引数)」という仕組みを使い、不等号の記号(< >)の中に型を記述します。
注意点として、ArrayListにはintやcharといった基本データ型(プリミティブ型)を直接入れることができません。代わりに、IntegerやString、Doubleといったラッパークラスや参照型を使用します。例えば、整数を扱いたい場合は「ArrayList<Integer>」と記述します。最近のJavaでは右側の型指定を省略できる「ダイヤモンド演算子」が使えるため、記述が非常にシンプルになっています。まずは、基本的な宣言の方法をコードで確認してみましょう。
import java.util.ArrayList;
public class ArrayListBasic {
public static void main(String[] args) {
// String型のデータを格納するArrayListを作成
ArrayList<String> fruits = new ArrayList<>();
System.out.println("リストを生成しました。");
}
}
3. データの追加(addメソッド)と取得(getメソッド)
リストにデータを追加するには、addメソッドを使用します。追加されたデータはリストの末尾に順番に並んでいきます。特定の場所にデータを割り込ませたい場合は、インデックスを指定してaddすることも可能です。
格納したデータを取り出すには、getメソッドを使用します。この際、リストの先頭は「0番目」から数えるというルールを忘れないようにしましょう。これを「ゼロインデックス」と呼びます。例えば、3つの要素がある場合、インデックスは0、1、2となります。範囲外の数値を指定するとエラーが発生するため注意が必要です。以下のサンプルでは、果物の名前を追加して、順番に取り出す方法を示しています。
import java.util.ArrayList;
public class ListAddGet {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
// データの追加
list.add("リンゴ");
list.add("バナナ");
list.add("オレンジ");
// データの取得(0番目と2番目)
String first = list.get(0);
String third = list.get(2);
System.out.println("1番目: " + first);
System.out.println("3番目: " + third);
System.out.println("現在のリスト全表示: " + list);
}
}
1番目: リンゴ
3番目: オレンジ
現在のリスト全表示: [リンゴ, バナナ, オレンジ]
4. データの削除(removeメソッド)の活用
不要になったデータをリストから削除するには、removeメソッドを使います。削除の方法には2通りあります。一つは「何番目のデータを消すか」というインデックス指定、もう一つは「このデータそのものを消す」というオブジェクト指定です。
インデックス指定で削除した場合、削除された場所よりも後ろにある要素が自動的に一つずつ前に詰められます。これが配列にはないArrayListの非常に強力なメリットです。自分でデータを詰め直す処理を書く必要がないため、バグが混入しにくく、簡潔なコードが書けます。オブジェクト指定の場合は、最初に見つかった一致する要素が削除されます。また、全てのデータを一気に消去したい場合にはclearメソッドが用意されています。
import java.util.ArrayList;
public class ListRemove {
public static void main(String[] args) {
ArrayList<String> colors = new ArrayList<>();
colors.add("赤");
colors.add("青");
colors.add("黄");
colors.add("緑");
// インデックス1(青)を削除
colors.remove(1);
// 「黄」という値を直接指定して削除
colors.remove("黄");
System.out.println("削除後のリスト: " + colors);
}
}
削除後のリスト: [赤, 緑]
5. リスト内の検索(contains・indexOf)
大量のデータを扱っていると、「特定のデータがリストに含まれているか」を調べたい場面が出てきます。その際に役立つのがcontainsメソッドです。このメソッドは、指定した値が存在すればtrue、なければfalseを返してくれるため、if文などの条件分岐で頻繁に使われます。
また、「含まれているかどうか」だけでなく「どこにあるか」を知りたい場合はindexOfメソッドを利用します。一致する要素があればそのインデックス番号を、なければ「-1」を返します。これにより、特定のユーザー名が名簿リストの何番目に登録されているかといった情報を簡単に取得できます。データの有無を確認してから処理を行うという流れは、実務のプログラムでも非常に一般的なパターンです。
6. サイズの確認と繰り返し処理(for文・拡張for文)
ArrayListの中身を一つずつ順番に処理したい場合、ループ処理を組み合わせます。まず、リストに今いくつデータが入っているかを知るには、sizeメソッドを使用します。配列で使う「length」とは名前が異なるので、初心者が間違いやすいポイントです。
繰り返し処理には、通常のfor文を使う方法と「拡張for文」を使う方法の2種類があります。拡張for文は「リスト内の全ての要素を順番に取り出す」という目的において、非常にシンプルで読みやすいコードが書けるため推奨されています。インデックス番号を意識せずに、直接中身を変数として扱えるのが利点です。一方で、現在の番号が必要な場合や、特定の条件でスキップしたい場合などは、通常のfor文の方が適していることもあります。状況に応じて使い分けましょう。
import java.util.ArrayList;
public class ListLoop {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
System.out.println("リストのサイズ: " + numbers.size());
// 拡張for文による繰り返し処理
System.out.println("要素を一つずつ表示:");
for (Integer num : numbers) {
System.out.println("値: " + num);
}
}
}
リストのサイズ: 3
要素を一つずつ表示:
値: 10
値: 20
値: 30
7. データの更新(setメソッド)と注意点
一度追加した要素を別の値に置き換えたいときは、setメソッドを使用します。第一引数に書き換えたい場所のインデックス、第二引数に新しい値を指定します。addメソッドが「挿入」なのに対し、setメソッドは「上書き」であるという違いを明確に理解しておきましょう。
ArrayListを使用する際の最大の注意点は、パフォーマンス(処理速度)についてです。ArrayListは末尾へのデータの追加は非常に高速ですが、リストの途中にデータを挿入したり、途中の要素を削除したりすると、それ以降の要素をすべてずらす処理が発生するため、データ量が膨大になると処理が重くなることがあります。また、マルチスレッド環境(複数の処理が同時に動く環境)では、ArrayListはスレッドセーフではないため、不整合が起きる可能性があります。初心者のうちはあまり気にする必要はありませんが、ステップアップしていく過程でこれらの特性についても意識できるようになると、より高度なプログラミングが可能になります。
8. ArrayListと配列の使い分け
最後に、通常の配列とArrayListのどちらを選ぶべきかという指針を整理します。配列はメモリの消費が少なく、データの読み書きが極めて高速というメリットがありますが、サイズの固定が最大のネックとなります。一方でArrayListは、柔軟性が高く便利なメソッドが豊富に用意されているため、現代のJava開発においては、特別な理由がない限りArrayList(あるいは他のList実装)を選択するのが一般的です。
例えば、曜日(月〜日)のように「絶対に数が変わらないもの」を扱う場合は配列が適しています。しかし、ショッピングサイトのカートの中身や、SNSの投稿一覧のように「ユーザーの操作によって数が変動するもの」を扱う場合は、間違いなくArrayListが最適です。まずはArrayListを使いこなし、慣れてきたらLinkedListなどの他のコレクションと比較してみるのも面白いでしょう。これらの基本操作をマスターすることで、Javaでのデータ操作がより自由に、より楽しくなるはずです。