はじめに:Mapを制する者がJavaを制す!
Javaのプログラミングにおいて、「Map(マップ)」を理解して使いこなせるかどうかは、実務力に直結する重要なポイントです。
Mapは「キーと値の組み合わせ」でデータを管理するため、ユーザー情報、設定値、キャッシュなど、あらゆるシーンで使われます。
このブログでは、Mapの基本から、実際の選び方、よくあるミスまで、初心者でもスッキリ理解できるように丁寧に解説します。
1. Mapってなに?その正体を知ろう
✔ Mapの基本ルール
JavaのMapは、「キー」と「値」をセットで保存するコレクションです。
- キーは重複NG
- 値は重複OK
- インデックスは使わない(Listのような番号はない)
1 2 3 4 5 |
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。特に順序不要ならこれ!
1 2 3 4 5 |
Map<String, String> map = new HashMap<>(); map.put("apple", "りんご"); map.put("banana", "バナナ"); System.out.println(map.get("apple")); // りんご |
② LinkedHashMap:順番を守りたいなら!
- 特徴:追加順 or アクセス順を保持
- 性能:HashMapよりやや重い
- 用途:キャッシュや表示順が大事なときに使う
1 2 3 4 5 |
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)の処理時間
- 用途:ソートされたデータを扱いたいとき、範囲検索をしたいとき
1 2 3 4 |
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でキャッシュを作る
1 2 3 4 5 6 |
Map<String, String> cache = new LinkedHashMap<>(16, 0.75f, true) { protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 3; // 4つ目以降は削除 } }; |
✔ TreeMapで範囲検索をする
1 2 3 4 5 6 7 |
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でスレッド安全な操作
1 2 3 4 5 |
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選定のフローチャート
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
↓ 複数スレッドからアクセスする? → Yes:ConcurrentHashMap / ConcurrentSkipListMap → No ↓ ↓ キーのソートが必要? → Yes:TreeMap → No ↓ ↓ 順番を保持したい? → Yes:LinkedHashMap → No:HashMap ↓ 特殊な用途? → enumならEnumMap、弱参照ならWeakHashMap |
おわりに:Mapを正しく選べば開発力が上がる!
JavaのMapコレクションは種類が多く、混乱しがちですが、目的に応じた正しい選択をすることで、あなたのコードはより読みやすく、効率的になります。
まずは、
👉 「絶対にJavaプログラマーになりたい人へ。」
でMapの基本をしっかり学びましょう。
さらに、
- コードレビューをしてほしい
- Javaで本気の転職をしたい
- わからないところを質問したい
という方には、サイゼントアカデミー が全力サポートします!
次回は「List系コレクションの選び方」や「MapとStreamの連携術」なども取り上げていく予定です。お楽しみに!
コメント