【Java】データの管理が劇的にラクになる!Map(HashMap)の基本をマスターしよう
はじめに
みなさんどうも、おげんです。
前回は、データをまとめて扱う「List」について学びました。
Listはデータを順番に並べておくのにとても便利でしたが、こんな風に思ったことはありませんか?
- 「3番目のデータじゃなくて、『回復薬』の効果が知りたいんだ!」
- 「特定の名前(キー)を使って、一瞬で中身を取り出したい」
Listでこれをやろうとすると、端から順番に「これは回復薬?」「これは毒消し?」と探していく必要があって、データが増えるほど大変になります。
そんな時に登場するのが、今回ご紹介する「Map(マップ)」です。
Mapを使えば、「名前(キー)」と「中身(値)」をセットにして保存できるので、辞書を引くように一瞬で目的のデータにアクセスできます。
プロの現場でも、ユーザーIDからユーザー情報を取り出したり、設定名から設定値を読み込んだりと、超一軍で使われるこの武器。今回も、一緒にマスターしていきましょう!
- Listでデータを探すのが「面倒だな」と感じ始めた人
- 「名前」と「中身」をセットで管理したい人
- 辞書や図鑑のような仕組みをプログラムで作ってみたい人
Mapとは「ラベル付きの箱」である
ListとMapの最大の違いは、「どうやってデータを取り出すか」にあります。
- Listは「出席番号」管理 「1番の人!」「2番の人!」と番号で呼びます。中身が誰であれ、場所(インデックス)で管理するのがListです。
- Mapは「ネームプレート」管理 箱の一つひとつに「ラベル(キー)」を貼ります。「おげんさんの箱!」「アリスさんの箱!」と、名前で呼び出します。
「キー」と「値」のペア
Mapの世界では、このセットをこう呼びます。
- キー(Key): データを引き出すための「合言葉」や「ラベル」。重複はNG!
- 値(Value): 箱の中に入っている「本体」。
例えば、RPGの「道具図鑑」を作るならこんな感じです。
- キー:
"回復薬"→ 値:"HPを50回復する" - キー:
"毒消し"→ 値:"毒状態を治す"
なぜMapが「最強」なのか?
Listの場合、1,000個のデータの中から「毒消し」を探すには、最悪1,000回確認する必要があります。
でもMapなら、「『毒消し』をちょうだい!」と言うだけで、1,000個の中から一瞬で見つけ出してくれるんです。
このスピード感こそが、Mapが「辞書」と呼ばれる理由です。
HashMapの基本操作(putとget)
Javaで最もよく使われるMapの種類は、HashMap(ハッシュマップ)です。
まずは「データを入れる」ところから「取り出す」ところまで、RPGのアイテム図鑑を例に見てみましょう。
① データを入れる: put(キー, 値)
「この名前(キー)で、この中身(値)を保存してね!」と命令します。
// <キーの型, 値の型> を指定して作成
Map<String, String> itemDictionary = new HashMap<>();
// データを入れる(put)
itemDictionary.put("薬草", "HPを30回復する");
itemDictionary.put("毒消し", "毒状態を治す");
itemDictionary.put("聖水", "アンデッドにダメージ");② データを取り出す: get(キー)
「『薬草』の中身を教えて!」と、キーを指定して呼び出します。
String effect = itemDictionary.get("薬草");
System.out.println("薬草の効果は:" + effect);
// 出力:HPを30回復するここが注意!「上書き」のルール
Mapのキーは「重複NG」です。もし同じキーでもう一度 put すると、中身が新しいものに上書きされます。
itemDictionary.put("薬草", "HPを30回復する");
itemDictionary.put("薬草", "HPを100回復する"); // 上書き!
System.out.println(itemDictionary.get("薬草"));
// 出力:HPを100回復する(古い方は消える)Mapの全データを確認する(keySet)
Mapは「名前」で引き出すのが得意ですが、「今、図鑑に載っている全アイテムを表示したい!」という時もありますよね。
そんな時は、「まずラベル(キー)だけを全部集めて、それを順番に使う」というステップを踏みます。
「キーのセット」を取り出してループする
// 図鑑にあるすべての「アイテム名(キー)」を取り出す
for (String key : itemDictionary.keySet()) {
// 取り出したキーを使って、中身(値)をゲット!
String value = itemDictionary.get(key);
System.out.println("【" + key + "】" + value);
}なぜこう書くの?
MapはListと違って、「入れた順番」を覚えていないという特徴があります(※HashMapの場合)。
バラバラに箱が入っているイメージなので、まずは「どんな名前のラベルがあるかな?」と keySet() で一覧表をもらい、その一覧表を見ながら一つずつ箱を開けていく…という流れになるんです。
こんな時に便利!
- ステータス画面: 「攻撃力」「防御力」「素早さ」などの項目名と数値を一気に表示する。
- 設定一覧: アプリの設定項目をすべてリストアップする。
「キーがわかれば、値もわかる」。
この基本を拡張for文と組み合わせるのが、Mapを使い倒すコツです。
まとめ:適材適所で使い分けよう
今回は、特定の「名前」でデータを一瞬で引き出す 「Map(HashMap)」 について学びました。
最後に、「List」と「Map」の使い分けをシンプルにまとめておきます。
| 特徴 | List(リスト) | Map(マップ) |
| イメージ | 出席番号(1番, 2番…) | 辞書・ラベル(名前で引く) |
| 得意なこと | 順番に並べる、全部処理する | 特定の名前で一瞬で探す |
| 苦手なこと | 大量データから特定の一つを探す | 順番を保証するのが苦手 |
| 合言葉 | 「○番目のデータをちょうだい」 | 「『○○』のデータをちょうだい」 |
最強の組み合わせは「Map の中に List」
プロの現場では、これらを組み合わせて使うこともよくあります。
例えば、「クラス(Mapのキー)」 ごとに 「生徒たちのリスト(Listの値)」 を入れる、といった具合です。
データの持ち方を工夫するだけで、プログラムのコードは何十行も短く、そして読みやすくなります。
「どうやってデータを持たせれば、後で自分が楽できるかな?」
そう考えるようになったら、あなたはもう立派な設計者の卵です。
今回学んだ Map を使って、自分だけの「最強の図鑑」や「ステータス画面」を作ってみてくださいね!
今回も最後まで読んでいただき、ありがとうございました!
