new ArrayList<>() / リスト.add() / set() / get()
| 対応: | Java 1.2(1998) |
|---|
可変長のリストを作成し、要素を追加・変更・取得するためのメソッドです。『ArrayList』は配列と違って要素数を動的に変更できるため、サイズが事前に決まらないデータを扱う場面で広く使われます。
構文
import java.util.ArrayList; // 空の ArrayList を作成 new ArrayList<型>(); // 末尾に要素を追加 リスト.add(E e); // 指定した位置に要素を挿入 リスト.add(int index, E e); // 指定した位置の要素を変更 リスト.set(int index, E element); // 指定した位置の要素を取得 リスト.get(int index);
メソッド一覧
| メソッド | 概要 |
|---|---|
| new ArrayList<>() | 空の可変長リストを作成します。型引数にはリストに格納する要素の型を指定します。 |
| add(E e) | リストの末尾に要素を追加します。追加が成功した場合は『true』を返します。 |
| add(int index, E e) | 指定したインデックスに要素を挿入します。それ以降の要素は後ろにシフトされます。 |
| set(int index, E element) | 指定したインデックスの要素を新しい値に置き換えます。置き換え前の要素を返します。 |
| get(int index) | 指定したインデックスの要素を返します。インデックスは0始まりです。 |
サンプルコード
ArrayListAddGet.java
import java.util.ArrayList;
class ArrayListAddGet {
public static void main(String[] args) {
ArrayList<String> fighters = new ArrayList<>();
fighters.add("八神庵");
fighters.add("草薙京");
fighters.add("テリー・ボガード");
System.out.println(fighters);
fighters.add(1, "ブルー・マリー");
System.out.println(fighters);
System.out.println(fighters.get(0));
System.out.println(fighters.get(2));
String old = fighters.set(0, "ゲーニッツ");
System.out.println(old);
System.out.println(fighters);
ArrayList<Integer> nums = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
nums.add(i * 10);
}
System.out.println(nums);
}
}
コンパイルして実行すると次のようになります。
javac ArrayListAddGet.java java ArrayListAddGet [八神庵, 草薙京, テリー・ボガード] [八神庵, ブルー・マリー, 草薙京, テリー・ボガード] 八神庵 草薙京 八神庵 [ゲーニッツ, ブルー・マリー, 草薙京, テリー・ボガード] [10, 20, 30, 40, 50]
よくあるミス
よくあるミス1: IndexOutOfBoundsException(存在しないインデックスにアクセス)
『get()』や『set()』は0始まりのインデックスを使います。リストのサイズを超えたインデックスにアクセスすると『IndexOutOfBoundsException』がスローされます。
IndexNg.java
import java.util.ArrayList;
class IndexNg {
public static void main(String[] args) {
ArrayList<String> fighters = new ArrayList<>();
fighters.add("八神庵");
fighters.add("草薙京");
fighters.add("テリー・ボガード");
System.out.println(fighters.get(3));
}
}
コンパイルして実行すると次のようになります。
javac IndexNg.java java IndexNg Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
アクセス前に『size()』でリストの要素数を確認し、インデックスが有効な範囲内(0以上・size()未満)かどうかをチェックします。
IndexOk.java
import java.util.ArrayList;
class IndexOk {
public static void main(String[] args) {
ArrayList<String> fighters = new ArrayList<>();
fighters.add("八神庵");
fighters.add("草薙京");
fighters.add("テリー・ボガード");
int idx = 3;
if (idx < fighters.size()) {
System.out.println(fighters.get(idx));
} else {
System.out.println("インデックス " + idx + " は範囲外です(size=" + fighters.size() + ")");
}
}
}
コンパイルして実行すると次のようになります。
javac IndexOk.java java IndexOk インデックス 3 は範囲外です(size=3)
よくあるミス2: Arrays.asListで返るリストにaddしてUnsupportedOperationException
『Arrays.asList()』が返すリストは固定サイズです。要素の追加・削除を行おうとすると『UnsupportedOperationException』がスローされます。
AsListNg.java
import java.util.Arrays;
import java.util.List;
class AsListNg {
public static void main(String[] args) {
List<String> fighters = Arrays.asList("ブルー・マリー", "ゲーニッツ");
fighters.add("草薙京");
}
}
コンパイルして実行すると次のようになります。
javac AsListNg.java java AsListNg Exception in thread "main" java.lang.UnsupportedOperationException
要素の追加・削除が必要な場合は、『Arrays.asList()』の結果を『new ArrayList<>()』でラップして可変なリストを作成します。
AsListOk.java
import java.util.ArrayList;
import java.util.Arrays;
class AsListOk {
public static void main(String[] args) {
ArrayList<String> fighters = new ArrayList<>(Arrays.asList("ブルー・マリー", "ゲーニッツ"));
fighters.add("草薙京");
System.out.println(fighters);
}
}
コンパイルして実行すると次のようになります。
javac AsListOk.java java AsListOk [ブルー・マリー, ゲーニッツ, 草薙京]
概要
『ArrayList』はJavaで最もよく使われるコレクションクラスです。内部的には配列で実装されており、末尾への追加(『add()』)と要素の取得(『get()』)はO(1)で高速に動作します。一方、途中への挿入はそれ以降の要素をシフトする必要があるためO(n)になります。
プリミティブ型(『int』、『double』など)は直接格納できません。ラッパークラス(『Integer』、『Double』など)を使用してください。ただし、Java のオートボクシング機能により『nums.add(1)』のように書くと自動的に『Integer』に変換されます。
要素の削除やサイズ確認には『remove() / clear() / size()』、要素の検索には『contains() / indexOf()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。