カテゴリ: Java 更新日: 2025/11/19

JavaのLinkedHashMapを徹底解説!初心者でもわかる順序付きマップの基本と応用

LinkedHashMap クラス
LinkedHashMap クラス

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

生徒

「Javaでデータをキーと値で管理したいんですが、データの順序も保持できる方法はありますか?」

先生

「いい質問ですね!JavaのLinkedHashMapクラスを使うと、キーと値のペアを管理しつつ、挿入順序を保持できますよ。」

生徒

「挿入順序を保持するってどういうことですか?」

先生

「データを追加した順序で取得できるということです。では、基本的な使い方から見ていきましょう!」

1. LinkedHashMapとは

1. LinkedHashMapとは
1. LinkedHashMapとは

LinkedHashMapは、Javaのコレクションフレームワークに含まれる「順序付きのマップ型」で、キーと値のペアを管理するためのクラスです。ふつうのHashMapと同じように「キーから値を素早く取り出す」ことができますが、追加したときの順番(挿入順序)をそのまま覚えておいてくれるという大きな特徴があります。

たとえば、データを「キー1」「キー2」「キー3」の順に登録した場合、あとからfor文で取り出すときも「キー1」「キー2」「キー3」の順で取り出されます。順番を意識しないでよい場面ならHashMapでも問題ありませんが、「画面に表示する順番を固定したい」「履歴を古い順にたどりたい」といったときには、LinkedHashMapのほうが扱いやすくなります。

イメージしやすいように、ごく簡単なサンプルコードも見てみましょう。ここでは、登録した順番どおりに出力されることだけを確認します。


import java.util.LinkedHashMap;

public class SimpleLinkedHashMap {
    public static void main(String[] args) {
        LinkedHashMap<String, String> map = new LinkedHashMap<>();
        map.put("key1", "一番目");
        map.put("key2", "二番目");
        map.put("key3", "三番目");

        System.out.println(map); // {key1=一番目, key2=二番目, key3=三番目}
    }
}

このように、LinkedHashMapは「マップとしての使いやすさ」と「順序を保ったまま扱える」という二つの性質をあわせ持った便利なクラスです。Javaで順序付きのマップを使いたいときには、まずLinkedHashMapを思い出すようにしておくと、コレクション選びに迷いにくくなります。

2. LinkedHashMapの基本的な使い方

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

それでは、LinkedHashMapの基本操作を見てみましょう。データの追加や取得、順序が保持される動作を確認するプログラムを紹介します。


import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapExample {
    public static void main(String[] args) {
        // LinkedHashMapの作成
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();

        // データの追加
        map.put("Apple", 100);
        map.put("Banana", 80);
        map.put("Cherry", 120);

        // データの出力
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

この例では、「Apple」「Banana」「Cherry」の順にデータを追加しています。取り出すときも、追加した順序が保たれていることが確認できます。

実行結果:


Apple: 100
Banana: 80
Cherry: 120

3. LinkedHashMapの主な用途

3. LinkedHashMapの主な用途
3. LinkedHashMapの主な用途

LinkedHashMapは、以下のような用途で特に役立ちます。

  • ユーザーの操作履歴やアクセス履歴の管理。
  • 順序を保持したままデータを処理したい場合。
  • キャッシュ機能の実装。例えば、最近使ったデータを優先的に保持する仕組みを作成できます。

4. LinkedHashMapでキャッシュを実装する方法

4. LinkedHashMapでキャッシュを実装する方法
4. LinkedHashMapでキャッシュを実装する方法

LinkedHashMapを使うと、簡単にキャッシュ機能を実装できます。以下は、最も古いデータを自動的に削除するキャッシュの例です。


import java.util.LinkedHashMap;
import java.util.Map;

public class CacheExample {
    public static void main(String[] args) {
        // 最大3つのエントリを保持するキャッシュ
        LinkedHashMap<Integer, String> cache = new LinkedHashMap<>(3, 0.75f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest) {
                return size() > 3; // サイズが3を超えたら最も古いエントリを削除
            }
        };

        // データの追加
        cache.put(1, "A");
        cache.put(2, "B");
        cache.put(3, "C");

        // キャッシュにアクセス
        cache.get(1);
        cache.put(4, "D"); // 古いエントリが削除される

        // キャッシュの内容を出力
        System.out.println(cache);
    }
}

実行結果:


{2=B, 3=C, 4=D}

このプログラムでは、最大サイズを3に設定しており、新しいデータを追加すると最も古いデータが削除されます。

5. LinkedHashMapの注意点

5. LinkedHashMapの注意点
5. LinkedHashMapの注意点

LinkedHashMapを使用する際には、以下の点に注意してください。

  • 順序を保持するため、通常のHashMapに比べて少し処理速度が遅くなる場合があります。
  • 大量のデータを管理する場合、パフォーマンスの影響を検討する必要があります。
  • スレッドセーフではないため、複数スレッドからアクセスする場合はCollections.synchronizedMapConcurrentHashMapを検討してください。

6. まとめ

6. まとめ
6. まとめ

本記事では、JavaのLinkedHashMapクラスについて、基本的な特徴や使い方、さらにキャッシュ機能の実装方法までを解説しました。LinkedHashMapは、HashMapのようにキーと値でデータを管理しながら、挿入順序を保持する特性を持つコレクションです。特に順序が重要なデータ管理や、キャッシュ機能を作成したい場合に非常に役立ちます。

また、LinkedHashMapはデフォルトで挿入順序を保持しますが、アクセス順序を設定することも可能です。この特性を活かすことで、最近アクセスされたデータを優先的に管理するLRU(Least Recently Used)キャッシュを簡単に実装できます。

以下に、この記事で解説した内容を基にした簡単なサンプルプログラムを示します。このプログラムでは、LinkedHashMapを利用してデータを順序通りに管理し、挿入順序が保持されることを確認します。


import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapSummary {
    public static void main(String[] args) {
        // LinkedHashMapの作成
        LinkedHashMap<String, String> users = new LinkedHashMap<>();

        // データの追加
        users.put("101", "田中太郎");
        users.put("102", "佐藤花子");
        users.put("103", "鈴木一郎");

        // データの出力
        System.out.println("挿入順序が保持されるLinkedHashMapの内容:");
        for (Map.Entry<String, String> entry : users.entrySet()) {
            System.out.println("ユーザーID: " + entry.getKey() + ", 名前: " + entry.getValue());
        }
    }
}

実行結果:


挿入順序が保持されるLinkedHashMapの内容:
ユーザーID: 101, 名前: 田中太郎
ユーザーID: 102, 名前: 佐藤花子
ユーザーID: 103, 名前: 鈴木一郎

この例では、ユーザーIDと名前のペアをLinkedHashMapで管理し、挿入順序が保持されることを確認しています。LinkedHashMapは順序を意識したデータ管理に最適です。

先生と生徒の振り返り会話

生徒

「LinkedHashMapについてよくわかりました!データの順序が保持されるのは便利ですね。」

先生

「そうですね。挿入順序が重要なデータ管理や、キャッシュのような特定の用途で特に力を発揮します。」

生徒

「アクセス順序を使ったキャッシュの実装も面白そうでした。これなら最近使ったデータを効率よく管理できますね。」

先生

「その通りです。LinkedHashMapはカスタマイズも簡単なので、ぜひプロジェクトで試してみてください。」

生徒

「はい!今回は順序が保持される点がよく理解できました。HashMapとの違いもしっかり意識して使ってみます!」

先生

「その意気です。わからない点があればまた聞いてくださいね。」

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

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

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

LinkedHashMapとHashMapの違いは何ですか?

LinkedHashMapはデータの挿入順序を保持しますが、HashMapは順序を保証しません。順序を保持したい場合にはLinkedHashMapを選ぶと良いでしょう。

LinkedHashMapでアクセス順序を保持するにはどうすれば良いですか?

LinkedHashMapのコンストラクタにtrueを渡して初期化することで、アクセス順序を保持する設定にできます。

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

LinkedHashMapはスレッドセーフではありません。スレッドセーフにするには、Collections.synchronizedMapConcurrentHashMapを利用してください。

LinkedHashMapの最大容量を設定することはできますか?

LinkedHashMap自体に容量制限はありませんが、removeEldestEntryメソッドをオーバーライドすることで、キャッシュのように最大サイズを制限することが可能です。

LinkedHashMapはnullキーやnull値をサポートしていますか?

はい、LinkedHashMapはnullキーを1つ、null値を複数サポートしています。

キャッシュの実装にLinkedHashMapを使う利点は何ですか?

LinkedHashMapは挿入順序やアクセス順序を保持するため、最近使用されたデータを優先的に管理できるLRUキャッシュの実装に適しています。

LinkedHashMapの初期容量と負荷係数はどう設定しますか?

LinkedHashMapのコンストラクタで初期容量と負荷係数を指定できます。例えば、new LinkedHashMap<>(16, 0.75f)のように設定します。

LinkedHashMapのパフォーマンスに影響する要因は何ですか?

順序を保持するため、通常のHashMapより若干処理速度が遅くなります。また、大量のデータを管理する場合はメモリ使用量も増加します。

LinkedHashMapの内容をすべて削除するにはどうすれば良いですか?

clear()メソッドを呼び出すことで、すべてのエントリを削除できます。

LinkedHashMapで特定の値を持つエントリを検索できますか?

containsValue()メソッドを使用して特定の値が存在するかどうかを確認できます。
カテゴリの一覧へ
新着記事
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のHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.8
Java&Spring記事人気No8
Javaの@SuppressWarningsアノテーションの使い方を完全ガイド!初心者でもわかる警告の抑制方法