迷わない!JavaのMap系コレクション完全ガイド|HashMap・LinkedHashMap・TreeMapの違いと選び方をやさしく解説

Java

はじめに:Mapを制する者がJavaを制す!

Javaのプログラミングにおいて、「Map(マップ)」を理解して使いこなせるかどうかは、実務力に直結する重要なポイントです。

Mapは「キーと値の組み合わせ」でデータを管理するため、ユーザー情報、設定値、キャッシュなど、あらゆるシーンで使われます。

このブログでは、Mapの基本から、実際の選び方、よくあるミスまで、初心者でもスッキリ理解できるように丁寧に解説します。


1. Mapってなに?その正体を知ろう

✔ Mapの基本ルール

JavaのMapは、「キー」と「値」をセットで保存するコレクションです。

  • キーは重複NG
  • 値は重複OK
  • インデックスは使わない(Listのような番号はない)
Map<String, String> userMap = new HashMap<>();
userMap.put("id001", "Taro");
userMap.put("id002", "Hanako");
System.out.println(userMap.get("id001")); // → Taro

✔ ListやSetとの違い

コレクション特徴
List要素を順番で管理。重複OK
Set重複なし。順序は実装による
Mapキーと値のセット。キーは重複NG

2. Mapの種類と特徴まとめ

① HashMap:基本中の基本!

  • 特徴:順序保証なし、nullキー1つOK
  • 性能:平均O(1)の高速操作
  • 用途:最もよく使われるMap。特に順序不要ならこれ!
Map<String, String> map = new HashMap<>();
map.put("apple", "りんご");
map.put("banana", "バナナ");
System.out.println(map.get("apple")); // りんご

② LinkedHashMap:順番を守りたいなら!

  • 特徴:追加順 or アクセス順を保持
  • 性能:HashMapよりやや重い
  • 用途:キャッシュや表示順が大事なときに使う
Map<String, String> map = new LinkedHashMap<>();
map.put("first", "一番");
map.put("second", "二番");
System.out.println(map); // {first=一番, second=二番}

③ TreeMap:キーを自動でソート!

  • 特徴:キーが自動で昇順ソート
  • 制限:nullキーNG、キーは比較可能(ComparableまたはComparator)
  • 性能:O(log n)の処理時間
  • 用途:ソートされたデータを扱いたいとき、範囲検索をしたいとき
Map<String, String> map = new TreeMap<>();
map.put("b", "バナナ");
map.put("a", "りんご");
System.out.println(map); // {a=りんご, b=バナナ}

3. Mapの選び方:状況別チェックリスト

以下の表で、自分に合ったMapをすぐに選べるようになります!

判断ポイント内容おすすめのMap
順序を保持したい?追加順 or アクセス順で取り出したいLinkedHashMap
自動でソートしたい?キーを昇順・降順で並べたいTreeMap
速度最優先?大量データ・頻繁なアクセスがあるHashMap
nullキーやnull値が必要?キーや値にnullを使いたいHashMap / LinkedHashMap
マルチスレッド環境?複数スレッドで同時アクセスするConcurrentHashMap
キャッシュ用途?古いデータを自動で削除したいLinkedHashMap(キャッシュモード)
特殊用途(enumなど)?enumキーや弱参照を使いたいEnumMap / WeakHashMap

4. 実践コードで理解するMapの選び方

✔ LinkedHashMapでキャッシュを作る

Map<String, String> cache = new LinkedHashMap<>(16, 0.75f, true) {
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > 3; // 4つ目以降は削除
    }
};

✔ TreeMapで範囲検索をする

NavigableMap<String, String> map = new TreeMap<>();
map.put("a", "りんご");
map.put("b", "バナナ");
map.put("c", "さくらんぼ");

System.out.println(map.subMap("a", true, "c", false)); // {a=りんご, b=バナナ}

✔ ConcurrentHashMapでスレッド安全な操作

ConcurrentMap<String, Integer> cmap = new ConcurrentHashMap<>();
cmap.putIfAbsent("count", 1);
cmap.computeIfPresent("count", (k, v) -> v + 1);
System.out.println(cmap.get("count")); // 2

5. よくあるミスと注意点

  • TreeMapにnullキーを入れるとクラッシュ!
    → TreeMapではキーにnullは使えません
  • Hashtableを今でも使ってしまう
    → レガシーです。新しいコードでは使わない方が良い
  • キーのequals/hashCode/compareTo未実装
    → HashMap/TreeMapでは比較の正しさが命!
  • mutableなキーを使ってMapが壊れる
    → キーは変更不可のクラスで!

6. Map選定のフローチャート

↓ 複数スレッドからアクセスする?
    → Yes:ConcurrentHashMap / ConcurrentSkipListMap
    → No ↓

↓ キーのソートが必要?
    → Yes:TreeMap
    → No ↓

↓ 順番を保持したい?
    → Yes:LinkedHashMap
    → No:HashMap

↓ 特殊な用途?
    → enumならEnumMap、弱参照ならWeakHashMap

おわりに:Mapを正しく選べば開発力が上がる!

JavaのMapコレクションは種類が多く、混乱しがちですが、目的に応じた正しい選択をすることで、あなたのコードはより読みやすく、効率的になります。

まずは、
👉 絶対にJavaプログラマーになりたい人へ。
でMapの基本をしっかり学びましょう。

さらに、

  • コードレビューをしてほしい
  • Javaで本気の転職をしたい
  • わからないところを質問したい

という方には、サイゼントアカデミー が全力サポートします!


次回は「List系コレクションの選び方」や「MapとStreamの連携術」なども取り上げていく予定です。お楽しみに!

コメント

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