Java の List についての基本をまとめました。
Listとは
java.util.List
インターフェースは順序どおりに並んだ要素の集まりのコレクションであり、リストとしての振る舞いを規定しています。リストはサイズ変更が可能な配列のようなものですが、配列と違い格納できるデータは参照型のみです。
List インターフェースを実装している主な具象クラスはjava.util.ArrayList
やjava.util.LinkedList
です。どの具象クラスを使う場合でも基本的に参照変数の型はインターフェースであるjava.util.List
にしておきます。こうすることで具象クラスへの依存はオブジェクトの生成だけに限定することが可能です。当然 ArrayList で定義することもできますが推奨されていません。これはインターフェースの概念を理解する必要があるのですが、とりあえず形式的な規則と覚えておきましょう。
List<データ型> リスト名 = new ArrayList<データ型>(初期サイズ); // 推奨 ArrayList<データ型> リスト名 = new ArrayList<データ型>(初期サイズ); // 非推奨
Listの生成と初期値
Listの基本構文は以下の通りです。
List<データ型> リスト名 = new ArrayList<データ型>(初期サイズ);
初期サイズは必須ではありませんし、最初に 10 と指定したからといって、それ以上データを追加出来ないわけでもないです。右側のデータ型に関しては省略可能です。データ型自体を省略する書き方も一応出来ますが、何でも格納できてしまうので今はやらない方がいいでしょう。
List list = new ArrayList(); // 型引数を省略した場合はObject型になる(JDK1.4まで) List<データ型> list = new ArrayList<データ型>(); // 総称型の利用(JDK1.5) List<データ型> list = new ArrayList<省略>(); // ダイアモンド演算子で型引数を省略(JDK1.7)
リストを宣言と同時に初期化するには以下のような方法があります。
// Arraysクラスに定義されているArrayListが返ってくる。 // 本物のArrayListではないので add や remove が出来ない。 List<String> strs = Arrays.asList("hoge","fuga","bar"); // Streamを使う方法ならば本物のArrayListが返ってくる。 List<String> strs = Stream.of("hoge", "fuga", "bar").collect(Collectors.toList());
Listの基本メソッド
具象クラスで実装が必要な基本メソッドです。詳細な機能が知りたい場合は各具象クラスの Javadoc やソースコードを参照してください。
要素の追加に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
add(E e) | boolean | 指定された要素をリストの最後に追加。 |
add(int index, E e) | void | リスト内の指定された位置に要素を挿入。 |
addAll(Collection c) | boolean | 指定されたコレクションの全ての要素を、コレクションのイテレータによって返される順序で、リストの最後に追加。 |
addAll(int index, Collection c) | boolean | 指定されたコレクション内の全ての要素を、リストの指定された位置に挿入。 |
set(int index, E e) | E | 指定された位置にある要素を指定された要素に置き換える。戻り値は置き換える前の要素を返す。 |
要素の削除に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
remove(int index) | E | リスト内の指定された位置にある要素を削除。戻り値は削除した要素を返す。 |
remove(Object o) | boolean | 指定された要素がこのリストにあれば最初に検出される要素を削除。戻り値は削除できれば true。 |
removeAll(Collection c) | boolean | 指定されたコレクションに含まれる要素を全て削除。戻り値は削除できれば true。 |
clear() | void | 全ての要素をこのリストから削除。 |
要素の参照に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
get(int index) | E | リスト内の指定された位置にある要素を返す。 |
size() | int | リスト内にある要素の数を返す。 |
isEmpty() | boolean | リストに要素がない場合に true を返す。 |
contains(Object o) | boolean | 指定の要素がこのリストに含まれている場合に true を返す。 |
containsAll(Collection c) | boolean | 指定されたコレクションのすべての要素がこのリストに含まれている場合に true を返す。 |
indexOf(Object o) | int | 指定された要素がこのリスト内で最初に検出される位置を返す。ない場合は-1を返す。 |
lastIndexOf(Object o) | int | 指定された要素がこのリスト内で最後に検出された位置のインデックスを返す。ない場合は-1を返す。 |
equals(Object o) | boolean | 指定されたオブジェクトがこのリストと等しいかどうかを比較。 |
イテレータに関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
iterator() | Iterator |
リスト内の要素を適切な順序で反復するイテレータを返す。 |
listIterator() | ListIterator |
リスト内の要素を(適切な順序で)反復するリストイテレータを返す。 |
listIterator(int index) | ListIterator |
リスト内の指定された位置で始まる、リスト内の要素を(適切な順序で)反復するリストイテレータを返す。 |
リストの加工に関するメソッド
メソッド | 戻り値 | 機能 |
---|---|---|
retainAll(Collection c) | boolean | 指定されたコレクションに含まれている要素だけ保持する。含まれていない要素は削除する。 |
subList(int from, int to) | List |
指定された fromIndex(含む) から toIndex(含まない) までの部分のビューを返す。 |
toArray() | Object | リスト内のすべての要素を適切な順序の状態で配列にして返す。 |
toArray(T a) | T[] | リスト内の全ての要素を適切な順序の状態で配列にして返す。返される配列の方は指定された配列の型になる。 |
hashCode() | int | リストのハッシュコード値を返す。 |
defaultメソッド
Java 8 から追加されたインターフェースの default メソッドです。
Listインターフェース
メソッド | 戻り値 | 機能 |
---|---|---|
replaceAll(UnaryOperator o) | void | リストの各要素を関数を適用した結果で置換する。 |
sort(Comparator c) | void | 指定された Comparator が示す順序に従ってリストをソートする。 |
spliterator() | Spliterator |
リスト内の要素に対する Spiliterator を返す。 |
Collection/Iterableインターフェース
メソッド | 戻り値 | 機能 |
---|---|---|
removeIf(Predicate filter) | boolean | 条件を満たす場合は要素を削除する。戻り値は要素が1つでも削除された場合は true を返す。1.8で追加。 |
stream() | Stream |
順次ストリームを返す。1.8で追加。 |
parallelStream() | Stream |
並列ストリームを返す。1.8で追加。 |
forEach(Consumer action) | void | 指定されたアクションを全ての要素に実行する。1.8で追加。 |
Listの繰り返し処理
イテレータを使うパターンの順次繰り返し処理です。
List<String> list = Arrays.asList("hoge","fuga","bar"); for (Iterator<String> itr = list.iterator(); itr.hasNext();) { System.out.println("itere: " + itr.next()); } Iterator<String> itr = list.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); }
インデックスを使用して for ループを実行します。
for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
List は Collection / Iterable インターフェースを継承しているので拡張 for 文を使って順次処理をすることが可能です。
for (String str : list) {
System.out.println(str);
}
Java 8 からは Stream や default メソッドの forEach を使用して順次処理を実行できます。
list.stream().filter(v -> v.length() == 4).collect(Collectors.toList());
list.stream().map(String::toUpperCase).collect(Collectors.toList());
list.forEach(System.out::println);
List Tips
List の使用方法に関するちょっとした Tips です。
リストの空判定
リストが空かどうかを判定する場合はisEmpty
を使用しましょう。内部ではsize == 0
の判定をしているだけです。
if (list.size() == 0) if (list.isEmpty())
要素の存在チェック
要素が存在するかどうかはindexOf
メソッドよりcontains
の方が直感的で分かり易いです。こちらも内部ではindexOf(o) >= 0
の判定をしているだけです。
if (list.indexOf("hoge") != -1) if (list.contains("hoge"))
リストの重複要素削除
リストの重複要素を削除したい場合は Set が使えます。
// LinkedHashSetを使えば並び順も保証される List<String> newList = new ArrayList<>(new HashSet<>(oldList)); // Java8から追加された Stream を使う方法 list.stream().distinct().collect(Collectors.toList());