カテゴリ: Java 更新日: 2026/01/24

JavaのMap(マップ)の使い方を完全ガイド!Key-Value構造と基本操作を徹底解説

JavaのMapとは?Key-Value構造と基本的な使い方を初心者向けに解説
JavaのMapとは?Key-Value構造と基本的な使い方を初心者向けに解説

先生と生徒の会話形式で理解しよう

生徒

「プログラムで『名前』と『電話番号』みたいに、関連性のある二つの情報をセットで管理したいんですけど、良い方法はありますか?」

先生

「それならJavaのMapインターフェースを使うのが一番ですね。特定のキーワード(キー)を使って、それに対応する値(バリュー)を瞬時に取り出すことができる便利な仕組みですよ。」

生徒

「配列やListとは違うんですか?」

先生

「配列は番号で管理しますが、Mapは好きな文字や数字をラベルにして管理できるのが特徴です。それでは、基本的な使い方を詳しく見ていきましょう!」

1. JavaのMapとは?初心者向けに概念を解説

1. JavaのMapとは?初心者向けに概念を解説
1. JavaのMapとは?初心者向けに概念を解説

JavaにおけるMapとは、「キー(Key)」と「値(Value)」をペアにして保持するデータ構造のことです。現実世界で例えると、辞書や名簿、ロッカーの番号と中身のような関係に似ています。例えば、英単語の辞書であれば、「apple」という単語(キー)を引くと、「りんご」という日本語(値)が分かります。このように、何かのキーワードを元にデータを探したいときに非常に強力なツールとなります。

Javaの標準ライブラリには「コレクションフレームワーク」という便利な仕組みがあり、Mapはその中の一つとして定義されています。一般的に私たちがMapを使うときは、Mapという設計図(インターフェース)を元に作られたHashMapなどの具体的なクラスを利用します。

Mapの最大の特徴は、「キーの重複が許されない」という点です。一方で、「値」については重複しても構いません。例えば、出席番号1番の生徒の名前が「佐藤さん」で、2番の生徒の名前も「佐藤さん」であることは許されますが、1番という出席番号が二人存在することはできない、というイメージです。このルールがあるおかげで、キーを指定すれば必ず一つの値を特定できる仕組みになっています。

2. 代表的なHashMapの使い方と初期化方法

2. 代表的なHashMapの使い方と初期化方法
2. 代表的なHashMapの使い方と初期化方法

Javaで最も頻繁に使われるMapの実装クラスがHashMapです。HashMapはデータの追加や検索が非常に高速であるという特徴を持っています。まずは、Mapをどのように宣言し、実体化(インスタンス化)するのかを確認しましょう。

Mapを使う際は、Map<キーの型, 値の型> 変数名 = new HashMap<>();という形式で記述します。ここで使われている記号はジェネリクスと呼ばれ、どのような種類のデータを扱うかを指定するものです。


import java.util.HashMap;
import java.util.Map;

public class MapBasicExample {
    public static void main(String[] args) {
        // キーがString型、値がInteger型(整数)のMapを作成
        Map<String, Integer> scores = new HashMap<>();
        
        // データの追加(putメソッド)
        scores.put("国語", 80);
        scores.put("数学", 95);
        scores.put("英語", 70);
        
        System.out.println("試験結果一覧: " + scores);
    }
}

試験結果一覧: {数学=95, 国語=80, 英語=70}

上記の実行結果を見ると分かる通り、HashMapはデータの順序を保持しません。追加した順番とは異なる順番で出力されることがありますが、これはHashMapの仕様です。順序を気にせず、とにかく高速にデータを扱いたい場合に適しています。

3. データの追加、取得、削除の基本操作

3. データの追加、取得、削除の基本操作
3. データの追加、取得、削除の基本操作

Mapを使いこなすためには、最低限必要な4つの操作を覚える必要があります。それは「追加」「取得」「削除」「確認」です。それぞれのメソッドを整理してみましょう。

  • put(key, value): 新しいペアを追加します。既に存在するキーを指定した場合は、値が上書きされます。
  • get(key): 指定したキーに対応する値を取り出します。キーが存在しない場合はnullを返します。
  • remove(key): 指定したキーのペアを削除します。
  • containsKey(key): 特定のキーがMapの中に存在するかどうかをチェックします(戻り値はboolean)。

これらのメソッドを組み合わせることで、複雑なデータの管理が簡単になります。次に、これらの操作を網羅したサンプルコードを見てみましょう。


import java.util.HashMap;
import java.util.Map;

public class MapOperationExample {
    public static void main(String[] args) {
        Map<String, String> fruits = new HashMap<>();
        
        // 1. データの追加
        fruits.put("Apple", "赤色");
        fruits.put("Banana", "黄色");
        fruits.put("Melon", "緑色");
        
        // 2. データの取得
        String color = fruits.get("Apple");
        System.out.println("Appleの色は: " + color);
        
        // 3. キーの存在確認
        if (fruits.containsKey("Banana")) {
            System.out.println("バナナは登録されています。");
        }
        
        // 4. データの削除
        fruits.remove("Melon");
        System.out.println("削除後のMap: " + fruits);
    }
}

Appleの色は: 赤色
バナナは登録されています。
削除後のMap: {Apple=赤色, Banana=黄色}

4. ループ処理でMapの全要素を取り出す方法

4. ループ処理でMapの全要素を取り出す方法
4. ループ処理でMapの全要素を取り出す方法

Mapに格納されているすべてのデータを一つずつ取り出して処理したい場面はよくあります。しかし、MapはListのように添え字(インデックス)でループを回すことができません。そのため、entrySet()keySet()といったメソッドを使用します。

最も推奨される方法は、キーと値の両方を同時に扱えるentrySet()を使った拡張for文によるループです。この方法を使えば、大きなデータセットでも効率的に処理を行うことができます。


import java.util.HashMap;
import java.util.Map;

public class MapLoopExample {
    public static void main(String[] args) {
        Map<String, Integer> inventory = new HashMap<>();
        inventory.put("鉛筆", 50);
        inventory.put("消しゴム", 15);
        inventory.put("ノート", 30);
        
        // entrySetを使ったループ処理
        for (Map.Entry<String, Integer> entry : inventory.entrySet()) {
            String item = entry.getKey();
            Integer count = entry.getValue();
            System.out.println("商品名: " + item + ", 在庫数: " + count);
        }
    }
}

商品名: 鉛筆, 在庫数: 50
商品名: ノート, 在庫数: 30
商品名: 消しゴム, 在庫数: 15

このコードでは、Map.Entryという型を使ってキーと値のペアを取り出しています。また、Java 8以降であれば、ラムダ式を使ったforEachメソッドを利用して、さらに簡潔に記述することも可能です。初心者のうちは、まずは拡張for文を使った形式に慣れておくのが良いでしょう。

5. HashMap以外のMapクラス:LinkedHashMapとTreeMap

5. HashMap以外のMapクラス:LinkedHashMapとTreeMap
5. HashMap以外のMapクラス:LinkedHashMapとTreeMap

JavaにはHashMap以外にも、用途に応じたMapの実装クラスが用意されています。最も代表的なものはLinkedHashMapTreeMapです。それぞれの違いを理解することで、より適切なプログラミングができるようになります。

LinkedHashMapは、データを入れた順番を保持してくれるMapです。HashMapでは順序がバラバラになりますが、LinkedHashMapを使えば、追加した順番通りに取り出すことができます。設定ファイルや履歴情報など、順序が重要な場合に利用されます。

TreeMapは、キーの自然順序(アルファベット順や数値順)に従って自動的に並べ替えを行うMapです。常にソートされた状態でデータを保持したい場合に便利ですが、HashMapに比べるとデータの追加や削除に少し時間がかかります。これら三つの使い分けは、プログラムの要件に合わせて選択しましょう。

6. Mapを使う際の注意点:nullの扱いと重複キー

6. Mapを使う際の注意点:nullの扱いと重複キー
6. Mapを使う際の注意点:nullの扱いと重複キー

Mapを扱う上で初心者が躓きやすいポイントがいくつかあります。まず一つ目は、キーの重複です。同じキーに対してputを二回行うと、古い値は消えてしまい、新しい値で上書きされます。意図せずデータを消してしまわないように、既にキーが存在するかどうかを確認する習慣をつけましょう。

二つ目は、nullの扱いです。HashMapはキーや値にnullを許容しますが、TreeMapのようにnullキーを許可しないクラスもあります。また、getメソッドで存在しないキーを指定した際に返されるnullをそのまま処理しようとすると、NullPointerExceptionというエラーが発生する原因になります。値を取り出した後は、nullチェックを行うか、Java 8から導入されたgetOrDefaultメソッドを使うのが安全です。


import java.util.HashMap;
import java.util.Map;

public class MapSafetyExample {
    public static void main(String[] args) {
        Map<String, String> userMap = new HashMap<>();
        userMap.put("user01", "田中");
        
        // 安全な値の取得方法(キーがない場合にデフォルト値を返す)
        String userName = userMap.getOrDefault("user02", "名無しさん");
        
        System.out.println("取得したユーザー名: " + userName);
        
        // 重複したキーで追加してみる
        userMap.put("user01", "鈴木"); 
        System.out.println("上書き後のユーザー名: " + userMap.get("user01"));
    }
}

取得したユーザー名: 名無しさん
上書き後のユーザー名: 鈴木

7. Mapの応用:Listの中にMapを格納する構造

7. Mapの応用:Listの中にMapを格納する構造
7. Mapの応用:Listの中にMapを格納する構造

実際の開発現場では、Map単体ではなく、他のコレクションと組み合わせて使うことが非常に多いです。例えば、データベースから取得した複数のレコードを管理する場合、「Listの中にMapを入れる」という構造(List<Map<String, Object>>)がよく使われます。

一つのMapが一つの行(レコード)を表し、それをListでまとめることで、表形式のデータをプログラム内で表現できます。例えば、社員情報のリストを作る場合、一人一人の情報をMap(名前、年齢、部署)で作り、それをListに追加していきます。このような多重構造に慣れると、複雑なデータ処理もスムーズに行えるようになります。初心者のうちは少し難しく感じるかもしれませんが、データ管理の基本パターンとして覚えておくと非常に役立ちます。

8. Java 9以降の便利な初期化:Map.ofの使い方

8. Java 9以降の便利な初期化:Map.ofの使い方
8. Java 9以降の便利な初期化:Map.ofの使い方

以前のJavaでは、Mapに数個のデータを初期値として入れるだけでも、何行もputを書く必要がありました。しかし、Java 9からはMap.ofという便利なメソッドが登場し、一行で簡単に不変(内容を変更できない)Mapを作成できるようになりました。

Map<String, String> map = Map.of("key1", "value1", "key2", "value2");のように記述します。この方法は、定数としてMapを定義したい場合や、テストデータを作成したい場合に非常に便利です。ただし、このメソッドで作られたMapは後から要素を追加したり変更したりすることができない「Immutable(不変)」なオブジェクトである点に注意してください。変更が必要な場合は、再び新しいHashMapのコンストラクタに渡すなどの工夫が必要です。

カテゴリの一覧へ
新着記事
New1
Quarkus
Quarkusのフォーム認証を基礎から解説!初心者向けセキュリティ入門ガイド
New2
Micronaut
MicronautプロジェクトをGradleで管理する基礎!build.gradleの役割を解説
New3
Micronaut
LinuxでMicronautをセットアップする方法!パッケージ管理とGradle連携
New4
Java
Javaのswitch文を徹底解説!case・defaultの書き方と実例まとめ
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkusプロジェクト構成の基本を完全解説!初心者でも迷わない「どこに何を書くか」ガイド
No.2
Java&Spring記事人気No2
Quarkus
Quarkusのセキュリティ基礎を初心者でもわかるように解説!
No.3
Java&Spring記事人気No3
Quarkus
QuarkusとMicronautとHelidonを徹底比較!軽量Javaフレームワークの違いを初心者向けに解説
No.4
Java&Spring記事人気No4
Quarkus
Quarkusの開発環境構築で躓きやすいポイントを完全解説!初心者でも安心して始めるためのチェックガイド
No.5
Java&Spring記事人気No5
Micronaut
MicronautとSpring Bootの違いとは?アーキテクチャ比較で速さの秘密を理解する
No.6
Java&Spring記事人気No6
Quarkus
Quarkusでマイクロサービス開発が加速する理由を徹底解説!Java初心者でも分かるクラウドネイティブ
No.7
Java&Spring記事人気No7
Micronaut
Micronautのアプリケーション起動が速い理由を初心者向けに解説
No.8
Java&Spring記事人気No8
Micronaut
MicronautのAOPが高速な理由とは?コンパイル時AOPの仕組みを初心者向けに徹底解説