【Java学習|初心者向け】JavaのList作成、どっちを使う? List.of()とArrays.asList()の使い分けを徹底解説

1. 導入:なぜこの違いを知る必要があるのか

Javaでリストを作成する際、Arrays.asList()とList.of()のどちらを使うか迷ったことはありませんか?実は、この二つは見た目が似ていても、内部の挙動は大きく異なります。知らずに使っていると「値が変更できないはずなのに変わってしまった」「nullを入れたらエラーになった」といった予期せぬバグを引き起こす原因になります。現場で自信を持ってコードを書くために、この二つの決定的な違いを理解しておきましょう。

2. 基礎知識:Javaの不変性(Immutable)とは

まず重要なキーワードが「不変性(Immutable)」です。不変とは「一度作成したら、後から要素の追加・削除・変更ができない」ことを指します。

Arrays.asList():Java 1.2から存在する歴史あるメソッドです。元の配列とリストがリンクしており、リストを変更すると元の配列にも影響が出ます。
List.of():Java 9から導入された比較的新しいメソッドです。「完全な不変リスト」を作成するために設計されています。

3. 実装と解決策:具体的な違い

決定的な違いは以下の3点です。

1. 変更の可否:Arrays.asList()は要素の「書き換え」は可能ですが、要素の「追加・削除」はできません。一方、List.of()は全ての変更を拒否します。
2. Nullの扱い:Arrays.asList()はnullを含めることができますが、List.of()はnullを含めるとNullPointerExceptionが発生します。
3. メモリ効率:List.of()は内部的に最適化されており、メモリ消費が少なく、非常に高速です。

4. サンプルプログラム

以下のコードをコピーして、動作の違いを確認してみてください。

import java.util.Arrays;
import java.util.List;

public class ListComparison {
public static void main(String[] args) {
// Arrays.asList() の例
List list1 = Arrays.asList("Java", "Python", null);
list1.set(0, "C++"); // 要素の書き換えは可能!
System.out.println("Arrays.asList: " + list1);

// List.of() の例
List list2 = List.of("Java", "Python");
try {
list2.set(0, "C++"); // ここで UnsupportedOperationException が発生
} catch (UnsupportedOperationException e) {
System.out.println("List.of: 書き換え不可のため例外が発生しました");
}

// null のテスト
try {
List.of("Java", null); // ここで NullPointerException が発生
} catch (NullPointerException e) {
System.out.println("List.of: nullは許容されません");
}
}
}

5. 応用・注意点:現場での使い分け

現場でのベストプラクティスは、特別な理由がない限りList.of()を使うことです。

なぜList.of()か:現代のJava開発では「不変であること」がバグを防ぐ鍵になります。意図しない場所でリストが書き換えられる心配がないため、マルチスレッド環境でも安全です。
いつArrays.asList()を使うか:どうしてもnullを含める必要がある場合や、古いライブラリとの互換性で「変更可能なリスト(要素の書き換えが必要な場合)」が必要な時に限定して使用しましょう。

もし、「後から要素を追加したい」という場合は、List.of()やArrays.asList()ではなく、素直に `new ArrayList<>()` を使うのが最も安全で標準的な書き方です。用途に合わせて正しく使い分けることで、より堅牢なJavaコードを目指しましょう!

コメント

タイトルとURLをコピーしました