HashMap の基本(キーのハッシュ化) — 索引付き検索
Java で「キーと値のペア」を効率的に管理する代表的なコレクションが HashMap です。
初心者が理解すべきポイントは「キーをハッシュ化して高速検索できる仕組み」「使いどころ」「コードの書き方」です。ここでは例題を交えて解説します。
HashMap の特徴
- キーと値のペアを管理:
Map<K, V>の代表的な実装。 - キーをハッシュ化: キーの
hashCode()を使って内部のバケットに格納。 - 検索が速い: 平均 O(1) で値を取得できる。
- キーは一意: 同じキーを put すると値が上書きされる。
- null: キーに1つだけ null を許可、値は複数 null を許可。
👉 用途: 「索引付き検索」「IDやコードで素早く値を取り出す」場面に最適。
基本コード例
1. 作成と追加
import java.util.HashMap;
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("A001", "Apple");
map.put("B002", "Banana");
map.put("C003", "Cherry");
System.out.println(map); // {A001=Apple, B002=Banana, C003=Cherry}
}
}
Java2. 値の取得(索引付き検索)
String product = map.get("B002");
System.out.println(product); // Banana
Java3. 上書き
map.put("B002", "Blueberry");
System.out.println(map.get("B002")); // Blueberry
Java4. 存在確認
System.out.println(map.containsKey("C003")); // true
System.out.println(map.containsValue("Apple")); // true
Java5. 削除
map.remove("A001");
System.out.println(map); // {B002=Blueberry, C003=Cherry}
Java性能の考え方
| 操作 | 計算量 | 特徴 |
|---|---|---|
| put(key, value) | 平均 O(1) | キーをハッシュ化して格納 |
| get(key) | 平均 O(1) | キーから高速検索 |
| remove(key) | 平均 O(1) | キー指定で削除 |
| containsKey(key) | 平均 O(1) | キー存在確認 |
👉 大量データでも高速検索が可能。
ただし、キーの hashCode() 実装が適切でないと性能が落ちる。
例題で練習
例題1: 学生IDと名前の管理
HashMap<Integer, String> students = new HashMap<>();
students.put(1001, "Tanaka");
students.put(1002, "Sato");
students.put(1003, "Suzuki");
System.out.println(students.get(1002)); // Sato
Java例題2: 電話帳
HashMap<String, String> phoneBook = new HashMap<>();
phoneBook.put("Alice", "090-1111-2222");
phoneBook.put("Bob", "080-3333-4444");
System.out.println(phoneBook.get("Bob")); // 080-3333-4444
Java例題3: 出現回数カウント
String[] words = {"apple", "banana", "apple", "cherry", "banana"};
HashMap<String, Integer> counter = new HashMap<>();
for (String w : words) {
counter.put(w, counter.getOrDefault(w, 0) + 1);
}
System.out.println(counter); // {apple=2, banana=2, cherry=1}
Javaテンプレート集
作成
HashMap<KeyType, ValueType> map = new HashMap<>();
Java追加・更新
map.put(key, value);
Java取得
ValueType val = map.get(key);
Java存在確認
map.containsKey(key);
map.containsValue(value);
Java削除
map.remove(key);
Javaデフォルト値付き取得
map.getOrDefault(key, defaultValue);
Java実務でのコツ
- キーの設計:
equalsとhashCodeを正しく実装したクラスをキーに使う。 - 順序保持が必要なら:
LinkedHashMap(挿入順保持)、TreeMap(ソート順保持)を検討。 - スレッド安全: 複数スレッドで使う場合は
ConcurrentHashMapを利用。 - 大量データ: 初期容量を指定するとリサイズ回数が減り効率的。
まとめ
- HashMap は「キーで高速検索」できるコレクション。
- put/get/remove が平均 O(1) で効率的。
- 索引付き検索やカウント処理に最適。
👉 練習課題として「商品コードと商品名を HashMap に登録し、コードから商品名を検索する」プログラムを書いてみると、HashMap の便利さが体感できます。
