Java 逆引き集 | HashMap の基本(キーのハッシュ化) — 索引付き検索

Java Java
スポンサーリンク

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}
    }
}
Java

2. 値の取得(索引付き検索)

String product = map.get("B002");
System.out.println(product); // Banana
Java

3. 上書き

map.put("B002", "Blueberry");
System.out.println(map.get("B002")); // Blueberry
Java

4. 存在確認

System.out.println(map.containsKey("C003")); // true
System.out.println(map.containsValue("Apple")); // true
Java

5. 削除

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

実務でのコツ

  • キーの設計: equalshashCode を正しく実装したクラスをキーに使う。
  • 順序保持が必要なら: LinkedHashMap(挿入順保持)、TreeMap(ソート順保持)を検討。
  • スレッド安全: 複数スレッドで使う場合は ConcurrentHashMap を利用。
  • 大量データ: 初期容量を指定するとリサイズ回数が減り効率的。

まとめ

  • HashMap は「キーで高速検索」できるコレクション。
  • put/get/remove が平均 O(1) で効率的。
  • 索引付き検索やカウント処理に最適。

👉 練習課題として「商品コードと商品名を HashMap に登録し、コードから商品名を検索する」プログラムを書いてみると、HashMap の便利さが体感できます。

タイトルとURLをコピーしました