こんにちは!しーま(@s59shima)です。
いつもブログをご覧いただきありがとうございます。
今回は、こんな悩みや疑問を持った人に向けて記事を書きました。

配列のように複数の値を保持できるのは分かったけど、実際にどうやって使用するの!?
「リスト(List)の使い方」や「配列との違い」について知りたい方におすすめです。
プログラミングでの リスト(List) は使用頻度がめちゃめちゃあると思います。
基本的な使用方法などを学んでいきましょう!!
リスト(List)とは
複数の値をまとめて保持できるオブジェクトの総称を「コレクション」と言います。
そしてJavaには標準APIとしてコレクション関連が多数提供されています。
その中の1つとして【List】が存在します。
Listは、追加した順序を保持するコレクションです。
List系の代表的なクラスとして「ArrayList」「LinkedList」がありますね。
どのようなクラス図になっているか確認してみましょう。

実は、ArrayList/ LinkedListクラスは様々なクラスを継承したり、インターフェースを実装などをして成り立っているんです。※AbstractListクラスやAbstractCollectionクラスは省略。
リスト(List)の初期化
new演算子を用いて初期化・オブジェクトを生成することが出来ます。
たとえば、String型のリストを初期化・生成する場合はこんな感じになります。
import java.util.ArrayList;
ArrayList<String> list = new ArrayList<String>();

LinkedListを初期化・生成する場合は上記の【ArrayList】の部分を置き換えればよいです。
初期化のポイントは以下の2つです。
1. 要素数を指定しなくてもよい
リストは配列とは異なり、初期化の段階で要素数の宣言をしなくてもよいのです。
そのため、後から要素の追加・削除が可能です。
配列の場合は、下記のように初期化の段階で宣言する必要があり、要素数を宣言したら変更することはできません。
String[] array = new String[5]; // 配列の場合
ArrayList<String> list = new ArrayList<String>(); // リスト(List系)の場合
ここが配列と大きな違いになります。
2. ジェネリクスを用いて型を強調
リストの初期化を行う際、以下のように書くこともできます。
ArrayList list = new ArrayList();
実は、初期化は2種類の方法があるのです。違いはデータ型を宣言している・していないです。
ArrayList<String> list = new ArrayList<String>(); // データ型の宣言あり
ArrayList list = new ArrayList(); // データ型の宣言なし
データ型を宣言している <String> などの書き方はジェネリクス(Generics)と言います。
データ型を宣言してリストを初期化(ジェネリクス有)した場合と宣言せずリストを初期化(ジェネリクス無)した場合を比較し、ジェネリクス有が推奨される理由を解説します。
ジェネリクス【有】サンプルコード
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("java");
String message = list.get(0);
System.out.println(message);
}
}
実行結果は下記の通り。
java
ジェネリクス【無】サンプルコード
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("java");
String message = list.get(0);
System.out.println(message);
}
}
実行結果は下記の通り。
構文エラー(8行目)
ジェネリクス無の場合は、8行目で構文エラーとなってしまいました。
理由はリストを初期化する際にデータ型を宣言していないため、8行目でString型にキャストしてあげる必要があります。
つまり、8行目を「String message = (String)list.get(0)」と明示的に書く必要があります。
ジェネリクス【無】の場合、プログラムミスにも繋がりやすく、都度キャストする手間がかかります。
以上の理由から、リストを初期化する場合 ジェネリクス【有】で宣言することをオススメします。
リスト(List)のソート
リストを使えば簡単にソートが実現できます。小さい順・大きい順に並び替えるやり方について確認していきましょう。
小さい順に並び替える場合
まずは、小さい順に並び替える場合です。Javaの標準クラスを使用することで実現できますよ。

Collectionsクラスのsortメソッドです。
import java.util.ArrayList;
import java.util.Collections;
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("e");
list.add("c");
list.add("b");
list.add("d");
System.out.println(list); // ソート前の並び順
Collections.sort(list);
System.out.println(list); // ソート後の並び順
}
}
実行結果( ソート前の並び順 )は下記の通り
[a, e, c, b, d]
リストに挿入した順に表示されていることがわかりますね。ソートはされていません。
実行結果( ソート後の並び順 )は下記の通り
[a, b, c, d, e]
小さい順に並び替えされていることがわかります。
下記のたったの一行でソートすることが出来ます。とても便利ですよね。
Collections.sort(list);
ちなみに「アルファベット」以外で「数値」も小さい順に並び替えしてくれます。
大きい順に並び替える場合
次に、大きい順に並び替える場合です。
今回は2パターンの方法を紹介します。

1つ目は、CollectionsクラスのreverseOrderメソッドです。
こちらもJava標準クラス・メソッドを使用して実現できます。
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("e");
list.add("c");
list.add("b");
list.add("d");
System.out.println(list); // ソート前の並び順
Collections.sort(list, Collections.reverseOrder());
System.out.println(list); // ソート後の並び順
}
}
実行結果( ソート前の並び順 )は下記の通り
[a, e, c, b, d]
実行結果( ソート後の並び順 )は下記の通り
[e, d, c, b, a]
大きい順に並び替えされていることがわかります。
- 小さい順 Collections.sort( 対象のデータ )
- 大きい順 Collections.sort( 対象のデータ, Collections.reverseOrder() )
以上、Java標準クラスを使用してソート(並び替え)するやり方について紹介しました。
次は大きい順に並び替える2パターン目ですが、少し特殊です(笑)。
ですが、汎用的に並び替えができるので、合わせて紹介しますね。

2つ目は、Comparetorインターフェースのcompareメソッドです。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("e");
list.add("c");
list.add("b");
list.add("d");
// Comparatorインターフェースを使用
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
String s1 = (String)o1;
String s2 = (String)o2;
if (s1.compareTo(s2) < 1) {
return 1;
} else if (s1.compareTo(s2) == 0) {
return 0;
} else {
return -1;
}
}
});
System.out.println(list); // ソート後の並び順
}
}
実行結果( ソート後の並び順 )は下記の通り
[e, d, c, b, a]
大きい順に並び替えできていることがわかりますね。
まとめ
本記事は以上になります。
リスト(List)の初期化やソートの方法について解説を行いました。
使用方法について全ては紹介できなかったので、コードを書きながら色々と試していくとよいです。
最後まで読んで頂きありがとうございます。