はじめに
Javaでキーと値のペアを保存したいとき、よく登場するのが次の2つ:
HashMapTreeMap
どちらも Map<K, V> の実装ですが、用途・性能・機能が大きく違います。
この記事では、「TreeMapとHashMapって何が違うの?」という疑問に答えながら、実務でどう使い分ければいいかをやさしく解説します!
ざっくり違いを一覧で比較!
| 項目 | HashMap | TreeMap |
|---|---|---|
| 内部構造 | ハッシュテーブル | 赤黒木(ソート木) |
| 順序性 | 順不同(ランダム) | キー順にソートされる |
| 基本操作 | 平均 O(1) | O(log n) |
| nullキー | 1つだけ許可 | 使用不可 |
| ソート機能 | なし | firstKey(), tailMap() など充実 |
| 適用シーン | 高速アクセス・順序不要 | ソート・範囲検索が必要な場合 |
HashMapとは?
|
1 2 3 4 5 |
Map<String, Integer> map = new HashMap<>(); map.put("banana", 2); map.put("apple", 5); map.put("orange", 3); |
- データの保存・検索が超高速(平均 O(1))
- 順序は保証されない(取り出し順は毎回変わることも)
- キーに
nullを1つだけ入れられる
使いどころ:
- 単純にデータをキーと値で保存したいとき
- ソートや順序が不要な場面
- パフォーマンス重視の大量データ処理
TreeMapとは?
|
1 2 3 4 5 |
Map<String, Integer> map = new TreeMap<>(); map.put("banana", 2); map.put("apple", 5); map.put("orange", 3); |
- 自然順序(文字列なら辞書順)でキーが自動的にソートされる!
firstKey(),lastKey(),subMap()など、ソート済マップならではの便利メソッドが豊富nullキーは許されない(例外が出ます)
使いどころ:
- データをキー順に並べたいとき
- 範囲検索(特定のキーより小さい/大きい)をしたいとき
- ソート済リストとして扱いたいとき
実例で違いを体感!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Map<String, Integer> map1 = new HashMap<>(); map1.put("banana", 1); map1.put("apple", 2); map1.put("orange", 3); Map<String, Integer> map2 = new TreeMap<>(); map2.putAll(map1); System.out.println("HashMap:"); for (String key : map1.keySet()) { System.out.print(key + " "); // 順序はランダム } System.out.println("\nTreeMap:"); for (String key : map2.keySet()) { System.out.print(key + " "); // apple banana orange(ソート済) } |
nullキーの違いに注意!
|
1 2 3 4 5 6 |
Map<String, String> hMap = new HashMap<>(); hMap.put(null, "OK"); // 問題なし! Map<String, String> tMap = new TreeMap<>(); tMap.put(null, "NG"); // NullPointerException!! |
TreeMapは内部でキーを比較するため、null キーは許可されません。
TreeMapだけの便利な機能
|
1 2 3 4 5 6 7 8 9 |
TreeMap<String, Integer> scores = new TreeMap<>(); scores.put("Alice", 85); scores.put("Bob", 70); scores.put("Charlie", 92); System.out.println(scores.firstKey()); // Alice System.out.println(scores.lastKey()); // Charlie System.out.println(scores.headMap("Charlie")); // Alice, Bob |
順序付きデータの検索や範囲指定が超便利!
実務での使い分けポイント
| 目的 | HashMapがおすすめ | TreeMapがおすすめ |
|---|---|---|
| 高速な検索・追加 | ✅ | ❌ |
| ソートされた順序で保持 | ❌ | ✅ |
| nullキーが必要 | ✅ | ❌ |
| 範囲検索をしたい | ❌ | ✅ |
| メモリ効率を優先したい | ✅ | ❌ |
| 比較可能なキーを使う(例:文字列、整数) | ✅/❌ | ✅ |
まとめ:TreeMapとHashMapの違いはここが重要!
HashMap:とにかく速い!順序は気にしないTreeMap:順序が欲しいときの強い味方!ただしちょっと遅い- 状況によって「どちらを使うか」を使い分けよう!
自己学習したい人は…
まずは「絶対にJavaプログラマーになりたい人へ。」を読んで、基礎からしっかり学習!
一人じゃ不安な人は…
- 自分のコードを見てもらいたい!
- Javaで転職を目指したい!
そんな方は、サイゼントアカデミーでプロの学習&転職サポートを!


コメント