【Java】Listの基本
List の宣言
List
はインターフェースのため、ArrayList
などの実装クラスを使用します。
他にもLinkedList
やVector
などの実装クラスはありますが、多くの場合はArrayList
を使用します。
この記事でもArrayList
を中心に説明していきます。
List
を使用する際は、ジェネリスク<>
を用いて要素のクラスを指定します。
int
など基本のデータ型を使用する際は、Integer
のようなラッパークラスを用います。
List<Integer> list = new ArrayList<Integer>();
右辺のジェネリクスは省略することができます。
List<Integer> list = new ArrayList<>();
また以下のようにして配列をList
に変換することができます。
String[] ary = {"AAA", "BBB", "CCC"};
List<String> list = Arrays.ofList(ary);
List の追加
add
List
に要素を追加するにはadd
を使用します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add(1, "CCC");
//結果
//["AAA", "CCC", "BBB"]
引数が 1 つの場合は、その要素を末尾に追加します。 引数が 2 つの場合は、指定したインデックスに要素を追加します。
addAll
add
は 1 つの要素を追加しますが、addAll
は複数の要素を追加します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
List<String> add1 = new ArrayList<>();
add1.add("CCC");
add1.add("DDD");
List<String> add2 = new ArrayList<>();
add2.add("EEE");
add2.add("FFF");
list.addAll(add1);
list.addAll(1, add2);
//結果
//["AAA", "EEE", "FFF", "BBB", "CCC", "DDD"]
add
と同じく引数 1 つの場合は末尾に追加し、2 つの場合は指定したインデックスから追加します。
List の参照
get
get
は引数に指定したインデックスの要素を取得します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.get(1); //"BBB"
要素数範囲外のインデックスを指定した場合はIndexOutOfBoundsException
が発生します。
size
size
はList
の要素数を返します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.size(); //3
isEmpty
isEmpty
は、List
の要素数が 0 であることを判定し、その結果を真偽値で返します。
List<String> list = new ArrayList<>();
list.isEmpty(); //true
list.add("AAA");
list.isEmpty(); //false
List の置換
set
set
は、指定したインデックスの要素を置き換えに使用します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.set(1, "DDD");
//結果
//["AAA", "DDD", "CCC"]
replaceAll
replaceAll
はList
のすべての要素に対し、何らかの変更を加える際に使用します。
例えばすべての要素を小文字に変更する場合は以下のようにします。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.replaceAll(String::toLowerCase);
//結果
//["aaa", "bbb", "ccc"]
詳細は割愛しますが、引数に指定するのは関数型インターフェースUnaryOperator<T>
になります。
要素に対し、変換がかけられない場合はUnsupportedOperationException
が発生します。
List の検索
indexOf, lastIndexOf
indexOf
、lastIndexOf
は引数の要素を検索し、最初に一致した要素のインデックスを返します。
対象の要素がない場合は-1
を返します。
要素の一致とはequals
がtrue
のものを指します。
indexOf
は先頭から検索し、lastIndexOf
は末尾から検索します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.add("BBB");
list.add("CCC");
list.add("AAA");
list.indexOf("BBB"); //1
list.lastIndexOf("BBB"); //3
contains, containsAll
contains
, containsAll
は引数の要素を検索し、一致する要素があるかを真偽値で返します。
contains
は引数の 1 つの要素を検索し、containsAll
は引数のすべての要素を検索し、すべての要素に対して一致する要素がある場合のみtrue
を返します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
List<String> listA = new ArrayList<>();
listA.add("BBB");
listA.add("CCC");
List<String> listB = new ArrayList<>();
listB.add("BBB");
listB.add("DDD");
list.contains("BBB"); //true
list.contains("DDD"); //false
list.containsAll(listA); //true
list.containsAll(listB); //false
List の削除
clear
clear
はList
の要素をすべて削除し、空の状態(要素数を 0)にします。
remove
remove
は指定した要素を削除するのですが、指定方法が 2 パターンあります。
1 つはインデックスを指定する方法です。そのままインデックスに該当する要素を削除します。
もう 1 つはインスタンスを指定する方法です。検索の場合と同じで、引数に指定したインスタンスと一致する最初の要素を削除します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.add("DDD");
list.add("EEE");
list.remove(1); //["AAA", "CCC", "DDD", "EEE"]
list.remove("DDD"); //["AAA", "CCC", "EEE"]
removeAll
removeAll
は引数のすべての要素に一致する要素を削除します。
List<String> list = new ArrayList<>();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.add("AAA");
List<String> listA = new ArrayList<>();
listA.add("AAA");
listA.add("CCC");
list.removeAll(listA); //["BBB"]