1. はじめに
Javaでプログラミングを行う際、「List」は非常に頻繁に登場する重要なデータ構造のひとつです。Listを使えば、複数のデータを順番に格納し、必要に応じて簡単に追加や削除、検索などの操作を行うことができます。
しかし、Listを正しく活用するためには、初期化の方法をしっかり理解しておくことが不可欠です。初期化方法を誤ると、思わぬエラーやバグの原因になるだけでなく、プログラムの可読性や保守性にも大きく影響します。
本記事では、「java list 初期化」というテーマにフォーカスし、初心者でも分かりやすい基本的な初期化方法から、実践的なテクニック、よくある注意点までを体系的に解説していきます。特にJavaのバージョンごとの違いや、状況に応じたベストプラクティスも詳しく紹介しますので、現場のコーディングで迷ったときにも役立つ内容です。
これからJavaを学び始めた方はもちろん、普段からListを活用している方も、この機会に改めて初期化のパターンを整理してみましょう。
記事の後半にはFAQも用意しているので、疑問やトラブルの解消にもお役立てください。
2. Listの基本的な初期化方法
JavaでListを使い始める際、まず必要になるのが「空のList」を作る、つまりListを初期化する基本的な方法です。ここでは、最も一般的なArrayList
を例に、Listの基本的な初期化方法について解説します。
2.1 new ArrayList<>()による空のListの作成
最もよく使われるのが、new ArrayList<>()
を使った初期化です。以下のように記述します。
List<String> list = new ArrayList<>();
この書き方で、要素がひとつも入っていない空のListが作成されます。
ポイント:
List
はインターフェースであり、実際にはArrayList
やLinkedList
などの具体的なクラスのインスタンスを生成します。- 一般的には柔軟性の観点から、変数宣言は
List
型にしておくことが推奨されます。
2.2 初期容量を指定して初期化する方法
大量のデータを格納する場合や、あらかじめデータ量が分かっている場合は、初期容量を指定して初期化するのが効率的です。
例:
List<Integer> numbers = new ArrayList<>(100);
この例では、100個分の要素を事前に格納できるように内部配列を確保します。これにより、追加時の拡張コストが減り、パフォーマンス向上が期待できます。
2.3 LinkedListの初期化
必要に応じて、LinkedList
を使うこともあります。使い方はほぼ同じです。
List<String> linkedList = new LinkedList<>();
LinkedList
は、要素の追加・削除が頻繁に発生する場面で特に効果を発揮します。
このように、Javaではnew ArrayList<>()
やnew LinkedList<>()
を使って、簡単に空のListを初期化できます。
3. 初期値を持つListの作成方法
Javaでは、空のListだけでなく、初期値をあらかじめ持ったListを作成したい場面もよくあります。ここでは、代表的な初期化パターンとその特徴を紹介します。
3.1 Arrays.asList()を使う方法
Javaで最もよく使われる初期化方法のひとつが、Arrays.asList()
です。
例えば、以下のように記述します。
List<String> list = Arrays.asList("A", "B", "C");
この方法で初期値入りのListが作成されます。
注意点:
- 戻り値は固定長のList(サイズ変更不可)であり、
add()
やremove()
を使うとUnsupportedOperationException
が発生します。 - 要素の上書き(
set()
)は可能です。
3.2 List.of()を使う方法(Java 9以降)
Java 9以降では、List.of()
を使って不変Listを簡単に作成できます。
List<String> list = List.of("A", "B", "C");
特徴:
- 完全な不変List(
add()
やset()
、remove()
はすべて不可)。 - 可読性も高く、値の変更が必要ない用途に適しています。
3.3 new ArrayList<>(Arrays.asList(…))で可変Listを作る
初期値を持ちつつ、あとから要素の追加・削除もしたい場合はこの方法が便利です。
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
これで、初期値を持った可変Listが完成します。
add()
やremove()
も問題なく使えます。
3.4 ダブルブレースイニシャライザ
少しマニアックですが、匿名クラスを利用した「ダブルブレースイニシャライザ」もあります。
List<String> list = new ArrayList<>() {{
add("A");
add("B");
add("C");
}};
特徴と注意点:
- コードがコンパクトになりますが、匿名クラス生成による余計なオーバーヘッドや、メモリリークのリスクがあるため、通常は推奨されません。
- 一時的なテストやサンプルコードで使う程度に留めましょう。
このように、用途や必要性に応じてさまざまな初期値付きListの作成方法が選べます。
5. 初期化方法の比較と選択基準
JavaでListを初期化する方法は多岐にわたりますが、どの方法を選ぶかは用途や開発シーンによって変わります。このセクションでは、それぞれの初期化方法の特徴を整理し、どんなときにどの方法を選ぶべきかを解説します。
5.1 可変Listと不変Listの違い
- 可変List(Mutable List)
- 要素の追加・削除・変更が可能
- 例:
new ArrayList<>()
、new ArrayList<>(Arrays.asList(...))
- 実行時に内容が変化する場合や、ループで要素を追加していく処理に最適
- 不変List(Immutable List)
- 作成後の要素追加・削除・変更が不可
- 例:
List.of(...)
、Collections.singletonList(...)
、Collections.nCopies(...)
- 「定数として扱いたい場合」や「安全な値の受け渡し」に適している
5.2 代表的な初期化方法の比較表
方法 | 可変性 | Javaバージョン | 特徴・用途 |
---|---|---|---|
new ArrayList<>() | 可変 | 全バージョン | 空のList。あとから自由に要素追加できる |
Arrays.asList(...) | 固定長 | 全バージョン | 初期値設定可能だがサイズ変更不可(要素変更は可) |
new ArrayList<>(Arrays.asList(...)) | 可変 | 全バージョン | 初期値を持ち、さらに可変。多用される |
List.of(...) | 不変 | Java 9以降 | シンプルな不変List。要素追加・変更不可 |
Collections.singletonList(...) | 不変 | 全バージョン | 要素1つの不変List。定数用途など |
Collections.nCopies(n, obj) | 不変 | 全バージョン | n個の同じ値で初期化。大量データやテスト用 |
Stream.generate(...).limit(n) | 可変 | Java 8以降 | 柔軟なパターン生成。ランダム値・連番などにも |
5.3 用途別おすすめ初期化パターン
- とりあえず空のListがほしい場合
new ArrayList<>()
- 初期値をセットし、あとから変更したい場合
new ArrayList<>(Arrays.asList(...))
- 定数として渡したい、内容を一切変えたくない場合
List.of(...)
(Java 9以降)Collections.singletonList(...)
- 要素が全て同じ値・決まった数だけ欲しい場合
Collections.nCopies(n, value)
- 特殊な生成パターンや、値を動的に生成したい場合
Stream.generate(...).limit(n).collect(Collectors.toList())

5.4 注意点
- 不変Listや固定長Listに対して要素の追加・削除を行うと例外が発生します。
- 可変性の有無や使うJavaのバージョンによって、最適な方法を選択しましょう。
Listの初期化方法を正しく選ぶことで、意図しないバグの防止や、コードの可読性・安全性の向上につながります。
6. よくあるエラーとその対処法
JavaでListを初期化・利用する際には、つまずきやすいエラーや想定外の動作が発生することがあります。ここでは代表的なエラー例と、その原因・解決策を紹介します。
6.1 UnsupportedOperationException
主な発生パターン:
Arrays.asList(...)
で生成したListに対してadd()
やremove()
を呼ぶList.of(...)
やCollections.singletonList(...)
、Collections.nCopies(...)
で生成したListに変更操作を行う
例:
List<String> list = Arrays.asList("A", "B", "C");
list.add("D"); // UnsupportedOperationExceptionが発生
原因:
Arrays.asList(...)
などで作られるListはサイズが固定されているか、完全に不変なListであり、要素の追加や削除はサポートされていません。
対処法:
- 可変Listにしたい場合は
new ArrayList<>(Arrays.asList(...))
でラップする
6.2 NullPointerException
主な発生パターン:
- Listを初期化せずに使おうとしてアクセスした場合
例:
List<String> list = null;
list.add("A"); // NullPointerExceptionが発生
原因:
- 変数が
null
のままでメソッドを呼び出している
対処法:
- 必ず初期化してから使用する
例:List<String> list = new ArrayList<>();
6.3 型に関する注意
- ジェネリクス(例:
List<String>
)を使わずにListを作ると、実行時に型エラーが発生するリスクがあります。 - 例:
List list = Arrays.asList("A", "B", "C");
Integer i = (Integer) list.get(0); // ClassCastExceptionが発生
- 対処法:
可能な限りジェネリクスを活用しましょう。
これらの典型的なエラーを把握しておけば、Listの初期化や運用時のトラブルを未然に防ぐことができます。
7. まとめ
この記事では、「java list 初期化」をテーマに、JavaでListを初期化するさまざまな方法と、その選び方や注意点について詳しく解説してきました。
まず、空のListを作る基本的な方法としてはnew ArrayList<>()
やnew LinkedList<>()
を紹介し、用途によっては初期容量の指定も有効であることを説明しました。
次に、初期値を持つListの作成方法として、Arrays.asList()
やList.of()
、さらには可変Listが必要な場合のnew ArrayList<>(Arrays.asList(...))
、そして特殊な場面で便利なダブルブレースイニシャライザなど、実践的なテクニックにも触れました。
また、特殊な初期化としてCollections.singletonList()
やCollections.nCopies()
、Stream.generate()
による柔軟な初期化方法も紹介し、可変・不変の違いや「どの方法を選ぶべきか」といった選択基準についても整理しました。
最後に、よくあるエラーと対処法として、UnsupportedOperationException
やNullPointerException
など、List初期化でつまずきやすいポイントをまとめています。
JavaのList初期化は一見シンプルですが、細かな違いを理解し、場面ごとに適切な方法を選ぶことが、安全で効率的なコーディングに繋がります。
本記事を通じて、ご自身の開発現場や学習の中で最適なList初期化方法を見つけていただければ幸いです。
8. FAQ(よくある質問と回答)
Q1: Arrays.asList()
で作ったListに要素を追加できますか?
A1: できません。Arrays.asList()
で生成されるListは固定長で、要素の追加や削除はできません。add()
やremove()
を使うとUnsupportedOperationException
が発生します。要素の追加・削除が必要な場合は、new ArrayList<>(Arrays.asList(...))
のようにArrayListでラップしましょう。
Q2: List.of()
とArrays.asList()
の違いは何ですか?
A2:
List.of()
(Java 9以降)は「完全に不変」なListを返します。要素の追加・削除・変更(set()
)もすべてできません。Arrays.asList()
は「固定長」のListで、要素の追加・削除はできませんが、既存要素の上書き(set()
)は可能です。
用途や目的に応じて使い分けてください。
Q3: ダブルブレースイニシャライザは使っても大丈夫ですか?
A3:
基本的には推奨されません。コードは短くなりますが、匿名クラスが生成されるため、予期しない副作用(メモリリークや可読性低下)のリスクがあります。サンプルやテストコード以外では、通常の初期化方法を使うのが安全です。
Q4: Listの初期容量を指定するメリットは?
A4:
大量のデータを追加することが分かっている場合、初期容量を指定してListを生成すると、要素追加時の内部配列拡張回数が減り、パフォーマンスが向上します。例:new ArrayList<>(100);
Q5: List初期化時の型指定(ジェネリクス)は必須ですか?
A5:
必須ではありませんが、型安全の観点から強く推奨されます。ジェネリクスを使わないと、実行時に思わぬ型エラーが起きることがあります。
例:List<String> list = new ArrayList<>();
Q6: Listをnullのまま使うとどうなりますか?
A6:
何らかのメソッド(add()
など)を呼び出した時点でNullPointerException
が発生します。必ず初期化してから使いましょう。
Q7: Javaのバージョンによる初期化方法の違いはありますか?
A7:
あります。List.of()
はJava 9以降で利用可能です。それ以前のバージョンではArrays.asList()
やnew ArrayList<>()
などを使いましょう。