カテゴリ: Java 更新日: 2025/06/03

JavaのLinkedListを徹底解説!初心者でもわかるリスト構造の基本と応用

LinkedList クラス
LinkedList クラス

先生と生徒の会話形式で理解しよう

生徒

「Javaでデータを順番に格納したいんですが、ArrayList以外の方法はありますか?」

先生

「はい、LinkedListというクラスがあります。これはArrayListとは異なる特徴を持つリスト構造で、特定の場面で便利です。」

生徒

「どんな場面で使えばいいんですか?」

先生

「LinkedListは、頻繁にデータを追加・削除する場合に役立ちます。基本的な使い方を見ていきましょう!」

1. LinkedListとは

1. LinkedListとは
1. LinkedListとは

LinkedListは、Javaのコレクションフレームワークに含まれるクラスで、リスト構造を実現するデータ構造です。要素がノードと呼ばれる単位で管理され、それぞれのノードが次のノードを指しています。

ArrayListは配列ベースですが、LinkedListは連結リストベースです。そのため、挿入や削除が多い場面で効率的に動作します。

2. LinkedListの基本的な使い方

2. LinkedListの基本的な使い方
2. LinkedListの基本的な使い方

以下は、LinkedListの基本操作を示すサンプルプログラムです。リストへの追加や削除、要素の取得を実行します。


import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        // LinkedListの作成
        LinkedList<String> list = new LinkedList<>();

        // データの追加
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // データの取得
        System.out.println("1番目の要素: " + list.get(0));

        // データの削除
        list.remove(1);
        System.out.println("削除後のリスト: " + list);
    }
}

実行結果:


1番目の要素: Apple
削除後のリスト: [Apple, Cherry]

この例では、リストへの追加、指定した要素の取得、そして要素の削除が順に行われています。

3. LinkedListの主な用途

3. LinkedListの主な用途
3. LinkedListの主な用途

LinkedListは以下のような場面で利用されます。

  • データの頻繁な追加・削除が必要な場合。
  • FIFO(先入れ先出し)のキューやLIFO(後入れ先出し)のスタックの実装。
  • 挿入や削除操作のパフォーマンスが重視されるケース。

4. LinkedListでキューやスタックを実装する方法

4. LinkedListでキューやスタックを実装する方法
4. LinkedListでキューやスタックを実装する方法

LinkedListを使ってキュー(Queue)やスタック(Stack)を簡単に実装できます。

キューの例:


import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // データの追加
        queue.add("A");
        queue.add("B");
        queue.add("C");

        // データの取り出し
        System.out.println("取り出した要素: " + queue.poll());
        System.out.println("現在のキュー: " + queue);
    }
}

実行結果:


取り出した要素: A
現在のキュー: [B, C]

スタックの例:


import java.util.LinkedList;

public class StackExample {
    public static void main(String[] args) {
        LinkedList<String> stack = new LinkedList<>();

        // データの追加
        stack.push("X");
        stack.push("Y");
        stack.push("Z");

        // データの取り出し
        System.out.println("取り出した要素: " + stack.pop());
        System.out.println("現在のスタック: " + stack);
    }
}

実行結果:


取り出した要素: Z
現在のスタック: [Y, X]

5. LinkedListの注意点

5. LinkedListの注意点
5. LinkedListの注意点

LinkedListを使用する際には、以下の点に注意が必要です。

  • ランダムアクセスには不向き。ArrayListと比較してインデックスによる要素の取得が遅いです。
  • メモリ使用量が多くなる場合がある。各ノードに前後のリンク情報を持つためです。
  • スレッドセーフではない。複数スレッドで利用する場合は、適切な同期化が必要です。

6. まとめ

6. まとめ
6. まとめ

今回の記事では、JavaのLinkedListについて詳しく解説しました。LinkedListは、要素がノードという単位で管理され、各ノードが次のノードを指し示すリスト構造です。この特徴により、頻繁にデータを追加・削除する場合に非常に効率的に動作します。特に、挿入や削除が多い場面で優れたパフォーマンスを発揮しますが、ランダムアクセスには向いていない点があるため、使用する際にはその特性をよく理解することが重要です。

LinkedListは、ArrayListとは異なり、要素を順番に格納するのではなく、各要素が前後の要素とリンクされる形式を取ります。このため、配列のようにインデックスを使ってアクセスするのではなく、リストの先頭から順番にノードをたどっていく形でアクセスが行われます。この構造は、特にリスト内での要素の追加や削除を効率よく行いたい場合に有効です。例えば、キューやスタックなどのデータ構造を簡単に実装することができ、FIFO(先入れ先出し)やLIFO(後入れ先出し)の管理が容易になります。

ただし、LinkedListにはいくつかの欠点もあります。例えば、ランダムアクセスの速度が遅いため、ArrayListに比べてインデックスによる要素の取得が非効率です。リストの中間にアクセスする際には、先頭から順にノードをたどらなければならないため、大きなリストになると性能が低下する可能性があります。そのため、ランダムアクセスが必要な場合には、ArrayListを選択する方が良いでしょう。さらに、LinkedListは各ノードに前後のリンク情報を持つため、メモリ使用量が多くなることも覚えておくべき点です。

また、LinkedListはスレッドセーフではないため、複数スレッドで同時にアクセスする場合には、適切な同期化を行う必要があります。特に並行処理が関わるシステムでは、この点を考慮して実装することが求められます。スレッドセーフなコレクションが必要な場合、Javaの他のコレクションクラスや同期化を利用する方法を検討するべきです。これらの注意点を理解した上で、LinkedListを効果的に活用することが重要です。

一方で、LinkedListは、データ構造として非常に柔軟であり、キューやスタック、双方向リスト(Deque)など、さまざまな形式で利用できます。これらのデータ構造をLinkedListを使って実装することで、パフォーマンスを向上させつつ、コードをシンプルに保つことができます。例えば、キューは「先入れ先出し(FIFO)」の順番でデータを処理するデータ構造で、スタックは「後入れ先出し(LIFO)」の順番でデータを処理するデータ構造です。これらをLinkedListで実装することで、データの追加や削除を効率的に行うことができます。

では、実際にLinkedListを使用したサンプルプログラムを見てみましょう。以下は、キュー(Queue)とスタック(Stack)を実装するためのLinkedListの使用例です。これらのプログラムでは、LinkedListを使って要素を追加・削除し、実際の挙動を確認することができます。

サンプルプログラム

キューの実装例:


import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        // データの追加
        queue.add("A");
        queue.add("B");
        queue.add("C");

        // データの取り出し
        System.out.println("取り出した要素: " + queue.poll());
        System.out.println("現在のキュー: " + queue);
    }
}

実行結果:


取り出した要素: A
現在のキュー: [B, C]

スタックの実装例:


import java.util.LinkedList;

public class StackExample {
    public static void main(String[] args) {
        LinkedList<String> stack = new LinkedList<>();

        // データの追加
        stack.push("X");
        stack.push("Y");
        stack.push("Z");

        // データの取り出し
        System.out.println("取り出した要素: " + stack.pop());
        System.out.println("現在のスタック: " + stack);
    }
}

実行結果:


取り出した要素: Z
現在のスタック: [Y, X]
先生と生徒の振り返り会話

生徒

「先生、LinkedListの利点はわかりましたが、具体的にどんな場面で使うべきですか?」

先生

「LinkedListは、データの挿入や削除が頻繁に行われる場合に最適です。例えば、タスク管理システムや、履歴の管理、キューやスタックが必要な場面で使用できます。」

生徒

「なるほど! 挿入や削除が多い処理にはLinkedListが向いているんですね。」

先生

「その通りです。しかし、ランダムアクセスが多い場合にはArrayListを使用した方が良いので、使用するシーンによって使い分けることが大切です。」

生徒

「理解しました! それでは、次にLinkedListを使ったプロジェクトを試してみます。」

先生

「良いですね! 実際に手を動かしてみることで、さらに深く理解できるでしょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaでデータをリストに追加する方法は?

Javaでは、LinkedListを使用してデータをリストに追加できます。例えば、list.add("データ")のように、addメソッドを使って要素を追加します。LinkedListは、データの挿入や削除が効率的に行えるリスト構造です。

LinkedListとArrayListの違いは何ですか?

LinkedListは連結リストに基づいており、データがノード単位で管理され、次のノードを指し示しています。一方、ArrayListは配列を基にしたリストで、インデックスを使用してアクセスします。LinkedListは頻繁にデータを追加・削除する場合に効率的です。

LinkedListの操作で最もよく使われるメソッドは何ですか?

LinkedListでは、addメソッドでデータを追加、removeメソッドでデータを削除、getメソッドでデータを取得します。また、pushやpopメソッドを使うことでスタック(LIFO)や、offerやpollメソッドを使ってキュー(FIFO)を実装できます。

LinkedListはどのような場面で役立ちますか?

LinkedListは、データの頻繁な追加や削除が行われる場合に特に役立ちます。例えば、キューやスタック、履歴管理やタスク管理のシステムでよく使用されます。

LinkedListはArrayListよりも効率的な操作がありますか?

はい、LinkedListはArrayListよりも頻繁に要素の追加・削除を行う場合に効率的です。ArrayListは配列ベースでランダムアクセスが高速ですが、LinkedListは連結リストベースで要素の追加や削除が効率的に行えます。

LinkedListのデータ取得速度は遅いのでしょうか?

はい、LinkedListはランダムアクセスが遅く、インデックスを使用してデータを取得する場合、ArrayListよりも性能が劣ります。データを取得する際にはリストの先頭から順番にノードをたどっていく必要があるため、アクセス速度が遅くなる可能性があります。

LinkedListはスレッドセーフですか?

いいえ、LinkedListはスレッドセーフではありません。複数のスレッドで同時に使用する場合は、適切な同期化が必要です。スレッドセーフなコレクションを使用したい場合は、Javaの他のコレクションや同期化を検討するべきです。

LinkedListのメモリ使用量は多いですか?

はい、LinkedListは各ノードに前後のリンク情報を持つため、ArrayListよりもメモリ使用量が多くなることがあります。各ノードにはデータの他にリンク情報も格納されるため、メモリを多く消費します。

LinkedListはキューやスタックにどう活用できますか?

LinkedListはキュー(FIFO)やスタック(LIFO)を簡単に実装できます。キューにはofferやpollメソッドを使用し、スタックにはpushやpopメソッドを使うことで、データの追加・削除を効率的に行うことができます。

LinkedListを使う際の注意点は何ですか?

LinkedListを使用する際は、ランダムアクセスが遅いため、大きなデータセットでのインデックス操作には向いていない点に注意が必要です。また、メモリ使用量が多くなる可能性やスレッドセーフでない点も考慮する必要があります。
カテゴリの一覧へ
新着記事
Springの@Transactional徹底解説!トランザクションの伝播・分離レベル・タイムアウトの基本
JavaのHashMapクラスgetメソッドの使い方を完全ガイド!初心者でもわかるjava.util入門
Thymeleafのth:fragmentを使ったテンプレートの再利用方法を完全ガイド!初心者でもわかる使い方
Javaの@PathVariableアノテーションの使い方を徹底解説!初心者でもわかるパスパラメータの基本と応用
人気記事
No.1
Java&Spring記事人気No1
Javaのラムダ式で配列を扱う!Arrays.streamの基本と注意点を初心者向けに解説
No.2
Java&Spring記事人気No2
JavaのRuntimeExceptionを完全解説!初心者でもわかるjava.langパッケージの基礎
No.3
Java&Spring記事人気No3
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.4
Java&Spring記事人気No4
JavaのIntegerクラスの使い方を完全ガイド!初心者でもわかる整数操作
No.5
Java&Spring記事人気No5
JavaのBigDecimalクラスcompareToメソッド完全ガイド!初心者でもわかる大小比較の基本
No.6
Java&Spring記事人気No6
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.7
Java&Spring記事人気No7
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法
No.8
Java&Spring記事人気No8
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本