はじめに
Javaでキーと値のペアを保存したいとき、よく登場するのが次の2つ:
HashMapTreeMap
どちらも Map<K, V> の実装ですが、用途・性能・機能が大きく違います。
この記事では、「TreeMapとHashMapって何が違うの?」という疑問に答えながら、実務でどう使い分ければいいかをやさしく解説します!
ざっくり違いを一覧で比較!
| 項目 | HashMap | TreeMap |
|---|---|---|
| 内部構造 | ハッシュテーブル | 赤黒木(ソート木) |
| 順序性 | 順不同(ランダム) | キー順にソートされる |
| 基本操作 | 平均 O(1) | O(log n) |
| nullキー | 1つだけ許可 | 使用不可 |
| ソート機能 | なし | firstKey(), tailMap() など充実 |
| 適用シーン | 高速アクセス・順序不要 | ソート・範囲検索が必要な場合 |
HashMapとは?
Map<String, Integer> map = new HashMap<>();
map.put("banana", 2);
map.put("apple", 5);
map.put("orange", 3);
- データの保存・検索が超高速(平均 O(1))
- 順序は保証されない(取り出し順は毎回変わることも)
- キーに
nullを1つだけ入れられる
使いどころ:
- 単純にデータをキーと値で保存したいとき
- ソートや順序が不要な場面
- パフォーマンス重視の大量データ処理
TreeMapとは?
Map<String, Integer> map = new TreeMap<>();
map.put("banana", 2);
map.put("apple", 5);
map.put("orange", 3);
- 自然順序(文字列なら辞書順)でキーが自動的にソートされる!
firstKey(),lastKey(),subMap()など、ソート済マップならではの便利メソッドが豊富nullキーは許されない(例外が出ます)
使いどころ:
- データをキー順に並べたいとき
- 範囲検索(特定のキーより小さい/大きい)をしたいとき
- ソート済リストとして扱いたいとき
実例で違いを体感!
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キーの違いに注意!
Map<String, String> hMap = new HashMap<>();
hMap.put(null, "OK"); // 問題なし!
Map<String, String> tMap = new TreeMap<>();
tMap.put(null, "NG"); // NullPointerException!!
TreeMapは内部でキーを比較するため、null キーは許可されません。
TreeMapだけの便利な機能
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で転職を目指したい!
そんな方は、サイゼントアカデミーでプロの学習&転職サポートを!


コメント