JavaのListは、要素の集合を扱う上で便利な機能です。しかし、Listの実装にはさまざまなクラスやバリエーションがあり、それを使いこなすにはListの仕組みに対する十分な理解が必要となります。
そこで、プログラミング初心者の方からフリーランス、大規模開発をする方まで、参考にできるListの初期化方法を紹介します。
目次
1.JavaのListを基礎から解説!
Listの初期化を理解するには、Listに関連するJavaの基本用語や操作を押さえる必要があります。そこで、プログラミング初心者の方向けに、Javaで使用するListの特徴や基本用語などの基礎を解説します。
JavaのListとは
Java開発で使われる「List」とは、さまざまな要素を扱えるコレクション(Collection)のことです。その特徴はインターフェースにあり、順序付けされた要素を取り出したり、追加したりできます。
そして、格納されている要素をオブジェクトとして扱うことが可能です。要素の重複にも対応できますし、Listで代表的なArraylistでは要素が「可変長(サイズ変更可能)」で、要素の追加・削除、データ管理といった操作も容易にできます。
もちろん、Listのインターフェースの中には、null要素の禁止や例外処理もあるため、正しい理解が必要です。
Listの理解難易度が高い理由
Listの理解には基本的なJava知識が前提として必要です。特に、プログラミング初心者にとっては、Java用語の「要素」や「オブジェクト」などの意味がわからないとListの意味を具体的に理解して自分の中に落とし込むことは難しいでしょう。
実際に、Java開発者でも「なんとなく使ってはいるが、正確に理解しているわけではない」という方もいます。そういうルールとして受け入れて、機械的に扱えることも大事ですが、エラーや大規模開発でのバグやエラーを極力出さないためには、できる限り正しい知識を押さえておくことが重要です。
Listに関連するJavaの基本用語
以下は、プログラミングやJavaで使われる簡単な用語の説明です。
要素
要素とは、プログラミングにおいてデータを扱うときに、コレクションに格納する1つずつの値の保管場所のことです。Listや配列のインターフェースを使うときに、データを要素として格納して使います。そのため、「パーツ」や「部品」などとは呼ばず、通常は「要素」という名称を使っています。
ただし、JavaにおけるListの「要素」は上記の意味を含みつつも、値だけでなく「参照」に使われることもあり、一般的な意味よりも広いことです。通常の要素は「プリミティブ型」で使われる値のことですが、Javaのように「オブジェクト型」でも動作する場合は、参照してその要素の格納されている場所を示すこともあります。
ちなみに、Listが要素をオブジェクトとして扱うのは、Javaの設計仕様である「オブジェクト指向」の特性からくるものです。
コレクション
コレクション(Collection)は、多数の要素を格納したオブジェクトのことです。わかりにくい方は、荷物(データ)を集積した倉庫(箱)をイメージしましょう。倉庫Aと倉庫Bには違う荷物(データ)が入っており、それを取り出していつでも使えるようにしています。
プログラミングでは、「データ構造」とも呼ばれるものです。コレクションには複数の種類があり、以下のものがあります。
List
Set
Queue
Deque
Map
上記の中で「List」は、インデックス(要素の位置)でアクセスして使う仕組みのものです。コレクションは、それぞれ仕組みが異なっていても、要素を扱うための特徴があります。
インターフェース
インターフェースとは、メソッドの具体的な処理を記述せずに、メソッドの型(先に型を記述)と変数を定義したものです。Listはインターフェースとして使われます。基本は「java.util.Collection」のサブインターフェース扱いとなります。これは、クラスではなく、インターフェースを継承したサブインターフェースです。
また、インターフェースとして処理を後から書くことができます。この特性から、1つまでのクラス継承の制限がなく、インターフェースを複数継承して新規作成できる「多重継承」が可能です。「継承」は、Javaにとって「カプセル化」や「多様性」などと並んで3大要素の1つとなります。
Listと配列の違い
Listと配列は、要素を格納してデータの集合を利用する点で似ています。しかし、Listが後から要素を追加できるのに対し、配列は最初に要素の数を宣言しないと使えないという制限的な特徴があるのです。
そのため、配列は要素数が事前に決まっています。これはメモリの領域にも関係していることです。具体的には、Listがリンクを使って後からメモリを確保し、配列では最初にメモリを割り振ってそれを保持します。
また、もう1つの違いとして、Listにはメソッドがあるのに対し、配列にはメソッドがありません。その代わり、配列には「配列.length」の構文が用意されています。配列の意味を示す「array」が配列型の変数によく使われます。Listにもインターフェースの1つに「Arraylist」があり、配列のように処理するListの利用方法があります
Listで使用する実装クラス
Listで使用する実装クラスは、「java.util」パッケージに含まれる以下のものです。
Arraylist
LinkedList
Vector
それぞれの実装クラスについて以下に説明します。
Arraylist
「Arraylist」は、順序付けされた要素のリストにアクセスする実装クラスです。「trimToSize()」の容量縮小、「ensureCapacity()」の容量拡大など独自メソッドが使えます。
特にランダムアクセスでは高速な処理が可能です。ランダムアクセスとは、インデックスで直接、格納場所にアクセスしてデータを取り出すことを指します。
ただし、削除や追加が遅く、要素が増えるほど取得に時間がかかる欠点があります。Arraylistではintのようなプリミティブ型を指定することもできません。
LinkedList
「LinkedList」は、順序ではなく、「両端キュー」という前と後ろ側からリンクした要素のリストにアクセスする実装クラスです。リンクを付け替えるだけで追加や削除ができるため、Arraylistよりも高速な処理ができます。
配列とは異なり、要素の大きさが先に定まっていない可変長です。ListやDequeのインターフェースを使って実装します。
Vector
「Vector」は、同期リストを取得するArraylistに近い可変長の配列を実装するクラスです。以前はJavaで使用されていましたが、いまではあまり使用されていません。Arraylistよりも処理が遅く、使い勝手がよくないためです。Javaでは、「Arraylist」か「LinkedList」のクラスを使用するのがおすすめです。
Listの活用例
Listは、次のような活用方法があります。
データ管理
検索エンジンの表示
GUI(グラフィカル・ユーザー・インターフェース)のコンポーネント
例えば、データ管理では企業が大量の顧客情報(アドレスや名前など)を取得してその管理を行うためにWEBアプリケーションの検索ツールを開発するケースです。CSVのリスト管理する機能実装などにも使われます。
また、検索エンジンのようにすでにあるサイト情報を特定のアルゴリズムで表示させる活用の仕方もあるのです。
2.JavaにおけるListの初期化
Javaでは、変数を使うときに初期化が必須です。以下に初期化についてやListの初期化の必要性、初期化の方法について解説します。
初期化とは
初期化とは、変数に値を代入することです。適切な値を格納することによって、最初からその値が入っている状態にします。この値のことを「初期値」と呼びます。
初期化は、IT分野でパソコン操作にも情報をリセットする意味で派生的に使われているため紛らわしく、根本的な意味は同じでもJavaで使う「Listの初期化」とは区別する必要があります。
初期化の必要性
Javaのプログラムにおいて、「変数」にはコンパイル時に自動的に初期値が入る場合と、初期値が入らない場合があります。変数がフィールドに分類される場合(例えば、要素が「int型」や「boolean型」)では、初期値(「0」や「false」)が決まっているのです。したがって、コンパイル時に自動的に型に対応した初期値が設定されます。
一方、 メソッドのローカル変数は、自動的に初期値が決まりません。つまり、初期化して値を入れないと、コンパイル時に値の設定がない状態となり、コンパイルエラーとなります。
今回の「List」のインターフェース(クラス「ArrayList」や「LinkedList」)も同様です。そのため、Listのメソッドで実装クラスを記述するときは、変数の初期化が必要です。
値が空の状態は変数が「null」となります。たとえフィールドの場合でも「参照型」は初期値「null」が設定されます。これがエラーの出る理由です。
特に「ArrayList」は、addしないと要素の値を追加できないため、nullでは初期化を行わずにクラスを設定するとaddできないため使えず、初期化が必須となります。
JavaにおけるListの初期化方法
JavaのListでは、初期化に「new」を使用します。例えば、「java.util.ArrayList」の「new ArrayList<>();」や、「java.util.Arrays$ArrayList」の「new ArrayList<>(Arrays.asList())」などです。ここでnewを宣言し、インスタンスの型にあった記述をすることにより初期化が可能です。
3.JavaのListで初期化後に使えるメソッドの種類
JavaのListでは、初期化をした後、さまざまな操作が可能です。よく使われるのが、「ArrayList」や「LinkedList」のクラスで使えるメソッドです。以下に、メソッドの種類を紹介します。
要素の追加
要素の追加とは、リスト内に新しいデータを追加することです。例えば、「1,2」のリストに「3」を追加することで「1,2,3」となるのです。要素の追加では、「add」メソッドを使用します。
「ArrayList」なら「リスト.add("");」です。原則、追加は末尾に行われます。また、追加位置の引数指定や全追加(adALL)などのバリエーションがあります。基本的に要素の追加は、newで初期化しないと追加できないのがaddメソッドです。
ただし、例外としてJava9以降は変更不可リスト(List.of())で要素を追加できる方法も登場しています。
要素の削除
要素の削除は、リストにある要素を消すことです。例えば、「1,2,3」のリストがあったとき、引数指定で「2」だけを削除することができます。また、削除のメソッドには、1個の要素を削除する「remove」だけでなく、全削除の「clear」、指定の値の要素すべてを削除する「removeAll」があります。
複数の同じ要素がある場合、removeでは最初の要素が削除されるため、走査する「イテレータ(Iterator)」を使う手段が手早く有効です。
要素の取得
要素の取得とは、リストに格納した要素を取り出すことです。一般的には、「get()」のメソッドの利用で位置を指定して、要素を取得することができます。このとき、get(i)で引数(i)を指定する形です。
Javaでは、配列のあるインデックスが0から始まるため、get(0)は1番目の要素、get(1)が2番目の要素です。出力する際 「System.out.println(list.get(0));」なら、1番目の要素を出力します。
要素の検索
要素の検索とは、リストの中に格納されている要素の中から、特定の要素だけを探し出すことです。主なメソッドには、有無を検索する「List.contains」や位置を特定する「List.indexOf」、合致する条件を指定する「stream.filter()」(Java8以降)などがあります。また、記号を使った正規表現の記述でも要素の検索は可能ですが、ここでは割愛します。
サイズ(要素数)の取得
サイズの取得とは、リストの長さを調べることです。リストの長さとは、リストの中にある要素の数を指します。Listでは「size()」というメソッドを使います。ちなみに、配列では「length()」のメソッドを使うという違いがあります。
要素の更新(上書き)
要素の更新とは、リストにある要素の1つやそのすべてを上書きすることです。メソッドでよく使われるのは、1つの要素を更新する「set()」や全更新の「replaceAll()」、特定条件のみ更新の「stream()」が挙げられます。
「replaceAll()」を使わずに、for文と「set()」の組み合わせでも全更新が可能です。
イテレーション
イテレーションとは、リスト内の要素を順番にアクセスして処理する方法です。イテレーションには、for文のループや「iterator()」、「forEach()」などさまざまなメソッドの方法があります。
ソート
ソートとは、リスト内の要素を並べ替えることです。通常は、「List.sort()」のメソッドを使います。昇順などに並び替える場合は「Collections.sort()」、並び順をカスタムする場合は「Comparator<T>」(コンパレータという関数型のインタフェース)が便利です。
4.JavaのListで初期化する実装のコード例
動物(犬、猫、人間)の3つをリストに加える例で実装パターン「ArrayList」「List.of()」「Arrays.asList()」「new ArrayList<>(List.of())」のそれぞれのコード例を紹介します。
「ArrayList」を使用した初期化の実装
1つ目は、リストで頻出の「ArrayList」のインターフェースを使用し、その中で「new ArrayList<>();」を宣言して初期化する方法です。以下では、「add()」で動物(animals)の3例(犬、猫、人間)をリストに加えています。
import java.util.List; import java.util.ArrayList;
public static void main(String[] args) { List<String> animals = new ArrayList<>(); animals.add("犬"); animals.add("猫"); animals.add("人間");
} } |
「List.of」を使用した実装
2つ目は、Listの「List.of」を使用した方法です。以下では、addを使わず直接リストに動物の要素を加えています。これは初期化をせずにコードを組めます。
import java.util.List;
public static void main(String[] args) { List<String> animals = List.of("犬", "猫", "人間");
} } |
「Arrays.asList()」を使用した実装2パターン
3つ目は配列をリストに変更する「Arrays.asList()」の方法です。実際には、配列で直接値を加える場合は初期化が不要となります。
ただし、intなどで値を入れるときは、「new int」のようにnewで初期化する必要があります。
初期化不要な例
以下は、初期化が不要な場合の例です。テキストで単語を要素としているため、配列コードの性質上、初期化が不要となります。
import java.util.List; import java.util.Arrays;
public static void main(String[] args) { List<String> animals = Arrays.asList("犬", "猫", "人間");
System.out.println("リスト: " + animals); } } |
初期化が必要な例
数字をリストにした後に、それをセット(set)で変更しています。
import java.util.List; import java.util.ArrayList; import java.util.Arrays;
public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(Arrays.asList(10, 20, 30));
numbers.add(50); //addで50を追加
} } |
Javaの「new ArrayList<>(List.of())」を使用した初期化の実装
List.ofの試用だけではできない、追加や削除ができるように「new ArrayList<>(List.of())」を使用する方法です。
import java.util.List; import java.util.ArrayList;
public static void main(String[] args) { List<String> animals = new ArrayList<>(List.of("犬", "猫", "人間"));
animals.remove("人間"); //人間を削除
} } |
【応用】クラス・コレクションを使った初期化で同じ値(nCopies)を入れる方法
ここで紹介した上記の4つの方法には、上級者向けに別バージョンをコレクションでクラスを使用して記述することもできます。
import java.util.Collections; import java.util.List;
public static void main(String[] args) {
System.out.println(animals); } } |
nCopiesは、同じ要素を3回格納する形で[犬, 犬, 犬]がリストの要素となるのです。同じものを繰り返し入れたいときに、for文を使わずに追加することができます。
最初の初期値状態に戻す実装
変更を加えたリストの実装に対して、最初の初期値状態に戻す方法です。この場合の初期値に戻す方法は、変更の後に初期化の操作をもう一度することです。そのため、与えたデータを元に戻すことができます。
import java.util.List; import java.util.ArrayList;
public static void main(String[] args) { List<String> animals = new ArrayList<>(); animals.add("犬"); animals.add("猫"); animals.add("人間");
animals.remove("人間"); //人間を削除 System.out.println("変更後のリスト: " + animals);
animals.add("犬"); animals.add("猫"); animals.add("人間");
} |
基本的には、他の実装方法でも再初期化をするか、多少手間でも1つずつ逆の手順で同じ操作をすることで初期値を返すことができます。
関連記事
【2025年版】Javaの最新バージョン|確認方法やインストール方法を解説
5.JavaでListを初期化するときの注意点
ここでは、JavaでListを使い初期化するときに気をつけるポイントを解説します。
「ArrayList」と「Arrays.asList」は置き換えられない
1つ目は、「ArrayList」と「Arrays.asList」は入れ替えられないことです。初期化の際、「ArrayList」のコードに「Arrays.asList」のコードを入れ替えて実行するとエラーが出ることがあります。
エラーが出ずに使用することも稀にできますが、基本的に2つは対象のオブジェクトが異なります。そのため、「java.util.ArrayList」のクラスを「Arrays.asList」は継承しておらず、互換性がないといえます。
JavaのListに初期値「null」が入らないようにする
2つ目は、JavaのListの中に初期値に「null」を入れないことです。Javaでは気づかずに「null」が入るとエラーが発生してバグの原因となります。
本来、初期化すればnullを回避できますが、Javaにはクラスの継承や使うクラスごとにコードが複雑化するため、nullがリスト内に入ってしまうことがあるのです。特に開発現場ではnullが入らないようにする工夫が求められます。
可変・不変を把握する
3つ目は、すでに述べたようにJavaのListはクラスによって変更や上書き更新の有無が異なります。そのため、不変のつもりで可変だったり、逆に可変のつもりで不変だったりすると、間違いのもととなります。
また、プログラムを変更することを想定した場合、コード作成やデバッグで不変だと変更が手間となることも考えておく必要があるのです。
6.JavaのListでよくある質問
ここでは、理解の難しいListに関して、よくある質問に回答します。
JavaのListを空にする方法(空の作成方法)は?
JavaのListを空にする方法は2つです。まずは、初期化して追加しない(例:「List<String> list = new ArrayList<>();」)で作成する方法です。元のデータがある場合は、ひと手間加えて、初期化で要素を加えた後、追加した要素をListのメソッド「clear」で全削除する方法です。これで空の作成ができます。ただし、空の作成は初期値から与えるとバグの原因となるため、後で要素の変更を考えている場合は注意が必要です。
JavaのList操作でaddできない理由は?
Listの操作でaddできない理由は、不変のクラスを使用している場合です。例えば、「Arrays.asList」は最初に決めた要素のサイズを変えることはできず、addできません。
また、「List.of」は先に示したように「ArrayList」と組み合わせないとaddできないのです。
JavaのListの実装でnewしないケースは?
JavaのListの実装でnewしないケースは、配列をリスト化する場合です。例えば、「List.of()」や「Arrays.asList()」の使用では、newで初期化することなく、要素をリストに当てはめることができます。
関連記事
Javaプログラミングで何ができる?始め方や基本文法、練習サイト5つを紹介
7.まとめ
今回は、JavaのListについて基本やメソッドの種類、実装のバリエーションと具体的な方法について解説しました。Listには追加や削除などの操作があり、それらを使うためには最初に初期化するのが原則です。
ただし、Listの中にはクラスによって「不変長」なものと「固定長」のものがあり、データが不変か・可変かを押さえた上で使う必要があります。以上を参考に、Listの実装を実際に工夫してコーディングしましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。