JavaにはListという配列よりも便利な型がありますが、
どんなときに使えばいいの?
ArraListって何?
など疑問を持っている方も多いのではないでしょうか?
そこで、この記事ではListについて、以下の内容で解説していきます!
- 【基礎】List型オブジェクトの宣言と初期化
- 【基礎】ループを使った要素へのアクセス
- 【基礎】Listのメソッドの使い方
- 【発展】Listの要素をソートする方法
- 【発展】Listと他のコレクションとの変換方法
今回はListについて、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
List型オブジェクトの宣言と初期化
まず初めに空のList型オブジェクトの作り方を解説します!
List<データ型名> オブジェクト名 = new ArrayList<データ型名>();
List型のオブジェクトにはArrayListクラスなどで生成したインスタンスを格納します。インスタンスを生成する際には、new演算子を用います。
例えばString型の要素をもつListの場合は、以下のように記述します。
List<String> list = new ArrayList<String>();
なお、List型オブジェクトの宣言と初期化の詳しい内容については、こちらを参考にしてくださいね。
ループを使った要素へのアクセス
for文などのループ処理を使って要素へアクセスする方法について解説します。
iteratorを使ったfor文
Listインターフェースを実装するクラスでは、iteratorメソッドを使ってIterator型のオブジェクトを使用することができるようになります。
Iterator型のオブジェクトからはhasNextメソッドやnextメソッドを呼び出して利用できます。
hasNextメソッドは、リストが次の要素を持っている場合にtrueを返します。nextメソッドはリストの次の要素を返します。
Listインターフェースを実装するクラスには、例えばArrayListクラスなどがあります。
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); for(Iterator it = list.iterator(); it.hasNext();) { System.out.println(it.next()); } } }
実行結果:
1 2 3 4
iteratorメソッドの使い方についてもっと詳しく知りたい方は、こちらを参考にしてくださいね。
forEachメソッド
Java8で追加されたforEachメソッドとラムダ式を使うと、リストの要素全てにアクセスする場合に簡潔に記述することができます。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); // 拡張for文 for(String s : list) { System.out.println(s); } // forEachメソッド list.forEach(System.out::println); } }
実行結果:
a b c a b c
forEachメソッドの使い方についてもっと詳しく知りたい方は、こちらを参考にしてくださいね。
Listのメソッドの使い方
Listインターフェースにはたくさんのメソッドが用意されています。メソッドを表にまとめました。
メソッド | 説明 | 記述例 |
---|---|---|
add | リストに値を追加 | list.add(1) |
addAll | リストにリストを追加 | list1.add(list2) |
set | リストの値を変更 | list.set(0, 3) |
get | リストの値を取得 | list.get(0) |
size | リストの要素数を取得 | list.size() |
indexOf | リストから値の要素番号を取得 | list.indexOf(“a”) |
subList | リストから範囲を指定してコピー | subList(1, 3) |
contains | リストに値が含まれるか判定 | list.contains(“a”) |
remove | リストから指定する要素番号の値を削除 | list.remove(1); |
distinct | リストで重複する値を削除 | list.stream().distinct() |
clone | リストのコピー | list.clone() |
それぞれのメソッドの使い方についてみていきましょう。
add, addAllで要素を追加する方法
addメソッドはリストに値を追加する場合に使用します。
addAllメソッドはあるリストに別のリストを追加する場合に使用します。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); list1.add(4); System.out.println(list1); List<Integer> list2 = new ArrayList<>(); list2.add(5); list2.add(6); list2.add(7); list2.add(8); list1.addAll(list2); System.out.println(list1); } }
実行結果:
[1, 2, 3, 4] [1, 2, 3, 4, 5, 6, 7, 8]
addメソッド、addAllメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
setで要素を書き換える方法
setメソッドはリストの要素を書き換える場合に使用します。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for(int i = 0; i < 5; i++) { list.add(i); } list.set(0, 3); System.out.println(list); } }
実行結果:
[3, 1, 2, 3, 4]
setメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
getで要素の値を取得する方法
getメソッドは要素の値を取得する場合に使用します。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(); //listにデータ追加する list.add("apple"); list.add("orange"); list.add("melon"); System.out.println(list.get(0)); } }
実行結果:
apple
getメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
sizeで要素数を取得する方法
sizeメソッドはリストの要素数を取得する場合に使用します。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); System.out.println("list = " + list); System.out.println("要素数 = " + list.size()); } }
実行結果:
list = [s, a, m, u, r, a, i] 要素数 = 7
sizeメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
indexOfで要素の位置を検索する方法
indexOfメソッドは指定した値がリスト内のどこに位置するか検索する場合に使用します。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<String> list = new ArrayList<>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); int index = list.indexOf("a"); System.out.println("要素番号 = " + index); } }
実行結果:
要素番号 = 1
indexOfメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
subListでListの一部をコピーする方法
subListはリスト内の範囲を指定し、範囲内のリストで新しいリストを作成する場合に使用します。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> mainList = new ArrayList<>(); mainList.add(0); mainList.add(1); mainList.add(2); mainList.add(3); mainList.add(4); List<Integer> sbList = mainList.subList(1, 3); System.out.println(sbList); } }
実行結果:
[1, 2]
subListメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
containsで要素の有無を確認する方法
containsメソッドは指定した値がリスト内にあるかないか判定する場合に使用します。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); List<String> listB = new ArrayList<String>(Arrays.asList("e", "n", "g", "i", "n", "e", "e", "r")); List<String> listC = new ArrayList<String>(); for(String a : listA) { if(listB.contains(a)) { listC.add(a); } } System.out.println("ListC = " + listC); } }
実行結果:
ListC = [r, i]
containsメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
removeで要素を削除する方法
removeメソッドは要素を削除する場合に使用します。
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> array = new ArrayList<>(); array.add("侍"); array.add("samurai"); array.add("さむらい"); array.add("サムライ"); array.remove(1); System.out.println(array); } }
実行結果:
[侍, さむらい, サムライ]
removeメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
distinctで重複する要素を取り除く方法
distinctメソッドはJava8から追加されたStream APIです。
リスト内の重複する要素を取り除く場合に使用します。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<String> listA = new ArrayList<>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); listA.stream().distinct().forEach(System.out::print); } }
実行結果:
samuri
distinctメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
cloneでListの全てをコピーする方法
cloneメソッドはリストのすべてをコピーする場合に使用します。
import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(); list1.add("a"); list1.add("b"); list1.add("c"); ArrayList<String> list2 = (ArrayList<String>)list1.clone(); System.out.println(list2); } }
実行結果:
[a, b, c]
cloneメソッドについて詳しく知りたい方は、こちらを参考にしてくださいね。
Listの要素をソートする方法
リスト内の要素を順番に並べ替える場合には、Collectionsクラスのsortメソッドを使用します。
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(10); list.add(30); list.add(5); list.add(2); list.add(11); list.add(90); System.out.println(list); Collections.sort(list); System.out.println(list); } }
実行結果:
[10, 30, 5, 2, 11, 90] [2, 5, 10, 11, 30, 90]
リストの要素をソートする方法についての詳しい解説は、こちらを参考にしてくださいね。
Listと他のコレクションとの変換方法
Listと他のコレクションとの相互変換についてみていきましょう。
配列とListの相互変換
配列からListに変換する場合は、ArraysクラスのasListメソッドを使用します。
Listから配列に変換する場合は、ListインターフェースのtoArrayメソッドを使用します。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { // 配列からListへの変換 String[] array1 = {"s", "a", "m", "u", "r", "a", "i"}; List<String> list1 = Arrays.asList(array1); System.out.println(list1); // Listから配列への変換 List<String> list2 = new ArrayList<>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); String[] array2 = list2.toArray(new String[list2.size()]); for(String s: array2) { System.out.println(s); } } }
実行結果:
[s, a, m, u, r, a, i] s a m u r a i
配列とListの相互変換についてもっと詳しく知りたい方は、こちらを参考にしてくださいね。
ListとSetの相互変換
それぞれのインスタンスを生成する際にコンストラクタの引数に変換前のオブジェクトを指定することで変換することができます。
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Main { public static void main(String[] args) { // ListからSetへの変換 List<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); list1.add(1); Set<Integer> set1 = new HashSet<>(list1); System.out.println(set1); // SetからListへの変換 Set<Integer> set2 = new HashSet<>(); set2.add(1); set2.add(2); set2.add(3); List<Integer> list2 = new ArrayList<>(set2); System.out.println(list2); } }
実行結果:
[1, 2, 3] [1, 2, 3]
ListとSetの相互変換についてもっと詳しく知りたい方は、こちらを参考にしてくださいね。
ListとMapの相互変換
ListからMapへ変換する場合は、Java8から追加されたStream APIのcollectメソッドを使うと簡潔に記述することができて便利です。
MapからListに変換する場合は、Listの要素にMapの値を変換する場合とキーを変換する場合とで使うメソッドが異なります。
値を変換する場合はvaluesメソッドを、キーを変換する場合はkeySetメソッドを使用します。
import java.util.Arrays; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // ListからMapへの変換 List<String> list = new ArrayList<>(Arrays.asList("chocolate", "makaron", "cheesecake", "pudding", "cookie", "pancake")); Map<String, Integer> map1 = list.stream().collect(Collectors.toMap(s -> s, s -> s.length())); System.out.println(map1); // MapからListへの変換 Map map2 = new HashMap(); map2.put("Samurai", "Engineer"); map2.put("Soldier", "Warrior"); List<String> listValues = new ArrayList<>(map2.values()); List<String> listKeys = new ArrayList<>(map2.keySet()); System.out.println(listValues); System.out.println(listKeys); } }
実行結果:
{cookie=6, cheesecake=10, pancake=7, makaron=7, pudding=7, chocolate=9} [Warrior, Engineer] [Soldier, Samurai]
ListとMapの相互変換についてもっと詳しく知りたい方は、こちらを参考にしてくださいね。
ListとArrayListの違い
ListとArrayListは混同されることが多いので、違いについて解説します。大きな違いはListはインターフェースで、ArrayListはListを実装したクラスになります。
インターフェースはオブジェクトの型として宣言時に使うことはできますが、インスタンスを生成することはできません。
以下のような記述は可能です。
List<データ型> オブジェクト名 = new ArrayList<>();
Listは左辺のようにオブジェクトの宣言時に型として使用することはできますが、右辺でnew句を使ってインスタンスを生成する場合には使用することはできません。
new句を使ってインスタンスを生成する場合は、ArrayListなどのListを実装したクラスがよく使われます。ちなみに、ArrayListはオブジェクトの宣言時の型として使用することももちろん可能です。
ではオブジェクトの宣言時にList型で宣言するのがいいのか、ArrayList型で宣言するのがいいのかどのように使い分けたらいいのでしょうか?
どちらも使い方によってメリット、デメリットがあります。詳しくはこちらを参考にしてください。
まとめ
いかがでしたか?
よく使うメソッドからあまり見かけないメソッド、新しいメソッドなど多くのメソッドを解説してきました。これらのメソッドの使い方を覚えることでJavaのListを使いこなすことが出来るようになります。
もし、Listについて忘れてしまったらこの記事を思い出してくださいね!