この記事の要点
- ArrayListは配列に似ているが、後から要素を追加できる点が異なる
- 必要な要素数が予測できる場合は配列を使い、プログラムを実行するまで要素数がわからない場合はArrayListを使う
- List.of()メソッドやArrays.asList()メソッドを使うと、初期化が簡単になる
以前、Javaの特徴や案件別の必要スキルなど、Javaの基礎について解説していました。
JavaのArrayListは配列に近い性質を持っていますが、いくらでも要素を追加できる点が便利です。
しかし配列と違ってやや扱いが難しく、用意されているメソッドも多いため理解するのは大変です。
そこで当記事ではArrayListの基本的な使い方に加えて、よく使われるメソッドだけを厳選して紹介しています。
さらに応用テクニックとして、2次元リストの扱い方についても紹介しています。
ArrayListをよく使う方、そしてこれから身につけたい方におすすめの内容です。
ArrayListとは
ArrayListはList(リスト)の一種で、使い方は配列に似ています。
ただし、後から要素数を増やせる点が配列との最大の違いです。
配列の場合、宣言時にサイズを確定させます。
そのサイズ以上のインデックスの要素を読み書きしようとすると、ArrayIndexOutOfBoundsExceptionという例外が発生します。
int[] array = new int[2]; array[0] = 0; array[1] = 1; array[2] = 2; // ArrayIndexOutOfBoundsException
一方、ArrayListの場合は(メモリが足りている限りは)好きなだけ要素を追加できます。
その代わり、配列よりもメモリ消費量が大きくなります。
どれくらいの要素数が必要か予めわかる場合は配列を使う、プログラムを実行するまで要素数がわからない場合はArrayListを使う、というように使い分けるとよいでしょう。
ArrayListの基本的な書き方
ArrayListの使い方は、以下の通りです。
import java.util.*; ArrayList<要素の型> list = new ArrayList<>();
ArrayListは「java.util」パッケージで提供されているので、importが必要です。
「」の部分はジェネリクスといい、やや難しい仕組みなので、慣れるまでは書き方を暗記して使うようにしましょう。
具体例を紹介します。
ArrayList<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); for(int i = 0;i < list.size();i++){ String str = list.get(i); System.out.println(str); }
使われているメソッドの詳細については後述しますが、addメソッドでリストに追加、getメソッドで引数に指定したインデックスの値を取得しています。
ほぼ配列と同じような使い方ができているのがお分かりいただけると思います。
ArrayListの主要メソッド
ArrayListでは、次のようなメソッドがよく使われます。
戻り値 | メソッド | 説明 |
---|---|---|
boolean | add(E e) | リストの最後に要素を追加する。 |
void | add(int index, E element) | 第一引数で指定した位置に、要素を追加する。 |
boolean | contains(Object o) | 引数のオブジェクトがリスト内にあるか判定する(あればtrue、なければfalse)。 |
E | get(int index) | 引数で指定した位置の要素を取得する。 |
boolean | remove(int index) | 引数で指定した位置の要素を削除する。 |
int | size() | リスト内の要素の数を取得する。 |
※表中の「E」は、リストに格納する要素の型を表します
サンプルコードは以下の通りです。
ArrayList<String> list = new ArrayList<>(); // リストの最後に要素を追加 list.add("a"); // [a] list.add("b"); // [a, b] // リストの1番目に要素を追加 list.add(1, "c"); // [a, c, b] // リスト内に"b"があるか判定 list.contains("b"); // true // リストの1番目の要素を取得 list.get(1); // "c" // リストの1番目の要素を削除 list.remove(1); // [a, b] // リスト内の要素の数を取得 list.size(); // 2
ArrayListの初期化方法
配列の場合、初期化子「{}」を使って、配列の中身を初期化する方法があります。
ArrayListの場合初期化子による初期化はできないため、次のようなメソッドを使います。
- List.of()
- Arrays.asList()
どちらもリストを作成する処理です。
ただし、このメソッドで作られたリストは、要素の追加や削除などができません。
そこで、作成したリストを丸ごとArrayListのコンストラクタに渡すことで、変更可能なArrayListを取得できます。
サンプルコードは以下の通りです。
ArrayList<String> list1 = new ArrayList<>(List.of("a1", "b1", "c1")); ArrayList<String> list2 = new ArrayList<>(Arrays.asList("a2", "b2", "c2"));
よくわからない場合でも、サンプルコードを真似することで初期化の処理ができますので、参考にしてください。
ArrayListで二次元配列を扱う方法
配列では、次のようにして「配列の配列(=二次元配列)」を作成できます。
int[][] array = new int[n][m]; array[n][m] = 値;
同様に、ArrayListでも「リストのリスト(=二次元リスト)」を扱えます。
考え方は配列の場合と同じですが、各要素にはメソッドでアクセスする点が異なります。
次のサンプルを参考にしてください。
ArrayList<String> list1 = new ArrayList<>(List.of("a", "b")); ArrayList<String> list2 = new ArrayList<>(List.of("c", "d")); ArrayList<ArrayList<String>> list = new ArrayList<>(); list.add(list1); list.add(list2); for(int i = 0; i < list.size(); i++){ ArrayList l = list.get(i); for(int j = 0; j < l.size(); j++){ System.out.println(l.get(j)); } }
リストを扱うためのリストなので、の中がリスト(ArrayList)になっているのがポイントです。
実行結果は、
a b c d
となります。
まとめ
ArrayListは、配列に似た性質を持っていますが、要素をいくらでも追加できる点が最大の違いです。
要素数を予測できないケースは多々あるため、ArrayListはかなり頻繁に使うことになります。
ただし、やや扱い方にくせがあるため、使いこなせるようになるにはある程度慣れが必要です。
使いどころが多く便利な機能なので、身に着けておくと役に立つこと間違いなしです。
ぜひ皆さんも練習してみてください。
また、Java初心者の課題としてよく挙げられるのが、自分の作りたいものがわからないことです。
その悩みを解決するための手順や、初心者の方でもJavaで作れるものについて詳しく解説していますので、参考にしてください。