ArrayListとは
List<String> color = new ArrayList<>(); color.add("red"); color.add("blue"); System.out.println(color.get(0)); // red |
1つの変数で複数の値を保持できます。
上記はArrayListクラスをインスタンス化してListインターフェイス型の変数に代入しています。
この変数colorは複数の値(redとblue)を持てるようになります。
<>はジェネリクスです。変数colorの各値はStringのみセット可能です。
ArrayListの特徴
ArrayListの変数のイメージ
要素
各項目を要素(element)といいます。
1つの変数で同じ型の複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
要素へのアクセス
要素の位置は、インデックス(添字)で管理します。
上記図では[0]、[1]、[2]、[3]がインデックスです。インデックスは0から始まります。
インデックスを使用してランダムアクセス(特定の要素へのアクセス)するため速いです。
要素の追加と削除
追加と削除ができます。(配列は不可です)
最後尾に追加する場合は早いです。
要素の先頭や途中に追加/削除する場合はインデックスを振り直すため遅いです。
例:インデックスが0,1,2の要素があるとします。インデックスの0を削除してインデックスが1と2になった場合、インデックスを0と1に振り直す動きが発生します。
その他
順序はあります。インデックスで管理します。
値の重複は可能です。
スレッドセーフではありません。
以下はOracleのJava8 API仕様のArrayListクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html
ArrayListを使用するサンプル
import java.util.ArrayList;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
System.out.println(list1); // [a, b]
}
}
6行目は、Listインターフェイス型の変数にしています。
要素は、addで追加します。
6行目にListとArrayListを使用しているので、1,2行目にimportが必要です。
インスタンス生成と同時に要素もセット
List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
System.out.println(c1); // [a, b, c]
インスタンス生成と同時に要素もセットされます。
要素を取得(get)
getは、要素の位置を指定して取得します。
List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
System.out.println(c1.get(0)); // a
System.out.println(c1.get(1)); // b
System.out.println(c1.get(2)); // c
要素の位置は0から始まります。
要素を取得(for文)
for文はループで要素を順に取得します。
List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (int i = 0; i < c1.size(); i++) {
System.out.println(c1.get(i)); // a b cが出力される
}
要素の位置は0から始まります。size()で要素数を取得します。
要素を取得(拡張for文)
for文はループで要素を順に取得します。
List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String str : c1) {
System.out.println(str); // a b cが出力される
}
拡張for文です。for文との違いは加算(i++)の表記がありません。
要素を取得(forEach+ラムダ式)
forEachはループで要素を順に取得します。
List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
c1.forEach(str -> System.out.println(str));// a b cが出力される
変数str以降はラムダ式です。
要素を取得(forEach+メソッド参照)
forEachはループで要素を順に取得します。
List<String> c1 = new ArrayList<>(Arrays.asList("a", "b", "c"));
c1.forEach(System.out::println);// a b cが出力される
System.out::printlnはメソッド参照です。
要素数が0の場合
List<String> c1 = new ArrayList<>();
for (String str : c1) {
System.out.println(str); //出力されない エラーにならない
}
ループ対象のオブジェクトの要素数が0の場合で拡張for文の処理を行った場合、エラーにはならず、出力もされません。
要素を検索し真偽値を返す(contains)
public boolean contains(Object o) |
containsメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
System.out.println(c1.contains("a")); // true (存在する)
System.out.println(c1.contains("Z")); // false (存在しない)
要素を検索し位置を返す(indexOf)
public int indexOf(Object o) |
indexOfメソッドは、指定の値が存在する場合は位置(数値)を、存在しない場合は-1を返します。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
System.out.println(c1.indexOf("b")); // 1
System.out.println(c1.indexOf("Z")); // -1 (存在しない)
中身が空か(isEmpty)
public boolean isEmpty() |
isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
System.out.println(c1.isEmpty()); //false (中身あり)
c1.clear(); // すべての要素を削除
System.out.println(c1.isEmpty()); //true (中身なし)
System.out.println(c1); //[]
要素数を取得(size)
public int size() |
sizeメソッドは、要素数を返します。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
System.out.println(c1.size()); //3
最後尾に要素を追加(add)
boolean add(E e); |
addメソッド(引数1つ)は最後尾に要素を追加します。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
c1.add("d");
System.out.println(c1);// [a, b, c, d]
指定の位置に要素を追加(add)
void add(int index, E element); |
addメソッド(引数2つ)は指定の位置に要素を追加します。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
c1.add(1,"d");
System.out.println(c1);//[a, d, b, c]
要素の位置は、a=0、b=1、c=2です。
指定の位置の要素を置き換え(set)
E set(int index, E element); |
setメソッドは要素を置き換えます。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
c1.set(1,"d");
System.out.println(c1);//[a, d, c]
要素の位置は、a=0、b=1、c=2です。
指定の要素を削除(remove)
public E remove(int index) |
removeメソッドは指定の位置の要素を削除します。削除後のインデックスは前につまります。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
c1.remove(0); // 指定の位置の要素を削除
System.out.println(c1); //[b, c]
System.out.println(c1.get(0)); //b
要素の位置は、a=0、b=1、c=2です。
全ての要素を削除(clear)
public void clear() |
clearメソッドはすべての要素を削除します。
List<String> c1 = new ArrayList<>(Arrays.asList("a","b","c"));
c1.clear(); // すべての要素を削除
System.out.println(c1); // []
要素の位置は、a=0、b=1、c=2です。
リストを連結 (addAll)
public boolean addAll(Collection<? extends E> c) |
addAllメソッドはリストを連結します。
List<String> list1 = new ArrayList<>(Arrays.asList("a","b"));
List<String> list2 = new ArrayList<>(Arrays.asList("c","d"));
list1.addAll(list2); // リストを連結
System.out.println(list1); // [a, b, c, d]
System.out.println(list2); // [c, d]
list1の後ろにlist2が追加されます。
メソッドの引数と戻り値がリスト
public class Test1 {
public static void main(String[] args) {
List<String> c1 = new ArrayList<>(Arrays.asList("a", "b"));
List<String> c2 = getName(c1); // 呼び出し元(引数と戻り値はリスト)
System.out.println(c2); // [a, b]
}
private static List<String> getName(List<String> c1) { // (呼び出し先)
return c1;
}
}
2行目は、呼び出し元のメソッドです。引数(実引数)と戻り値もリストです。
4行目は、定義されたメソッドです。引数(仮引数)と戻り値もリストです。
呼び出し元のメソッドの引数の変数名(a1)と定義されたメソッドの引数の変数名(c1)は異なっていても使用できます。
リストの中にリストを定義
List<List<String>> list1 = new ArrayList<>(); // リストの中にリストを定義
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
list2.add("c");
List<String> list3 = new ArrayList<>();
list3.add("d");
list3.add("e");
list3.add("f");
list1.add(list2); // リストにリストを追加
list1.add(list3); // リストにリストを追加
System.out.println(list1.get(0)); //[a, b, c]
System.out.println(list1.get(0).get(0)); //a getを2つ指定して取得
System.out.println(list1.get(0).get(1)); //b
System.out.println(list1.get(0).get(2)); //c
System.out.println(list1.get(1)); //[d, e, f]
System.out.println(list1.get(1).get(0)); //d
System.out.println(list1.get(1).get(1)); //e
System.out.println(list1.get(1).get(2)); //f
ArrayListの初期サイズ
ArrayList(int initialCapacity) |
ArrayListの要素数の初期サイズのデフォルト値は10です。
要素が追加されていくと自動的に拡張されていきます。
初期サイズは、ArrayListのコンストラクタの引数に指定します。
以下は初期サイズを30とした場合です。
List<String> color = new ArrayList<>(30);
ArrayListとListインターフェースの関係
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable |
ArrayListクラスはListインターフェースを実装しています。
使用例
List<String> a = new ArrayList<>(); |
ArrayListクラスをインスタンス化する時、ArrayListクラスの独自のメソッドを使用しない限り、Listインターフェイス型の変数にすることが多いです。
Listインターフェイスにあるメソッドを使用できます。
以下はOracleのJava8 API仕様のListインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html
関連の記事