はじめに
Javaでキーと値のペアを保存したいとき、よく登場するのが次の2つ:
HashMap
TreeMap
どちらも 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で転職を目指したい!
そんな方は、サイゼントアカデミーでプロの学習&転職サポートを!
コメント