JavaのHashMap完全ガイド:キーと値の最強コンビ!
こんにちは。ゆうせいです。
今回は、新人エンジニアの皆さんに向けてJavaの「HashMap(ハッシュマップ)」をわかりやすく解説します。
「リストやセットはわかったけど、マップってなに?」
「HashMapはいつ使うの?」
そんな疑問をスッキリ解決していきましょう!
HashMapって何?
「キー」と「値」のペアを管理するコレクション
HashMapは、Map
インターフェースを実装したキーと値(Key-Value)のセットを扱うデータ構造です。
例えるなら:
名前(キー)と電話番号(値)の「電話帳」!
Map<String, String> phoneBook = new HashMap<>();
phoneBook.put("山田", "090-1111-2222");
phoneBook.put("佐藤", "080-3333-4444");
このように、「名前から電話番号をすぐに引ける」ような使い方ができるんです!
特徴まとめ
特徴 | 説明 |
---|---|
キーは一意 | 同じキーは登録できない(上書きされる) |
値は重複OK | 同じ値が複数のキーにあってもOK |
順序なし | 登録順は保持されない(保持したいならLinkedHashMap ) |
nullをキーにも値にも使える | ただし、nullキーは1つまで |
よく使うメソッド一覧
メソッド名 | 説明 |
---|---|
put(K, V) | 値を追加または更新 |
get(K) | キーに対応する値を取得 |
remove(K) | 指定したキーのペアを削除 |
containsKey(K) | キーが存在するか調べる |
containsValue(V) | 値が存在するか調べる |
keySet() | すべてのキーの集合を取得 |
values() | すべての値の集合を取得 |
entrySet() | すべてのキーと値のペアを取得 |
size() | 登録されたペアの数を取得 |
clear() | 全要素削除 |
基本操作の例
Map<String, Integer> scores = new HashMap<>();
scores.put("英語", 85);
scores.put("数学", 92);
scores.put("国語", 76);
System.out.println(scores.get("数学")); // 92
scores.remove("国語");
System.out.println(scores.containsKey("英語")); // true
System.out.println(scores.size()); // 2
順序に注意!
HashMapは順番を保持しません。順番が重要な場合は次のように使い分けます:
クラス名 | 順序 | 用途例 |
---|---|---|
HashMap | 順序なし | 基本の高速マップ |
LinkedHashMap | 追加順 | 表示順を保ちたいとき |
TreeMap | キーの昇順 | 並び替えが必要なとき |
ループ処理:全データの走査
keySet()を使う方法
for (String subject : scores.keySet()) {
System.out.println(subject + ":" + scores.get(subject));
}
entrySet()を使う方法(より効率的)
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
よくあるミスと対処法
get()
でキーがないと nullが返る- →
containsKey()
で確認してから取得するのがおすすめ!
- →
- 同じキーに
put()
すると 上書きされる- → 追加でなく「更新」扱いになります。
応用:文字カウントや集計にも使える!
文字の出現回数を数える例
String[] words = {"apple", "banana", "apple", "orange", "banana"};
Map<String, Integer> countMap = new HashMap<>();
for (String word : words) {
countMap.put(word, countMap.getOrDefault(word, 0) + 1);
}
System.out.println(countMap); // {orange=1, banana=2, apple=2}
メリットとデメリット
メリット | デメリット |
---|---|
検索が高速 | 順序なしで扱いづらいことも |
キーによる直接アクセス | キーがnullのとき注意 |
柔軟な構造 | equalsとhashCodeの理解が必要な場合あり |
今後の学習のステップ
LinkedHashMap
やTreeMap
で順序をコントロール!Map<String, List<String>>
などのネスト構造に挑戦!ConcurrentHashMap
でスレッドセーフな処理も覚えておこう!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
