JavaのMapとHashMapを基礎から解説!新人気分でスッキリ理解しよう

今回は、Javaでよく使われる「Map(マップ)」とその代表的な実装である「HashMap(ハッシュマップ)」について、初心者の方でも理解できるようにじっくり解説していきます。

「Mapって、なんか難しそう…」という方もご安心ください。たとえば、英語と日本語の単語帳をイメージすると、かなり近い概念なんですよ!


Mapとは?〜キーと値でデータを結びつける仕組み〜

Mapは「辞書」のようなもの

JavaのMapインターフェースは、キー(Key)と値(Value)をセットにして保存するデータ構造です。

たとえば、次のような感じです:

キー(英単語)値(意味)
appleりんご
bananaバナナ

これ、まさに英和辞書そのものですね。

英語でいう"map"は「地図」という意味が有名ですが、動詞としての"map"は「関連づける」という意味があります。JavaにおけるMapも「あるキー(名前など)と、ある値(年齢など)を関連づける」ために使われます。


Mapの3つの特長

1. キーと値のペアで管理

Mapはリストや配列と違って、「順番」で管理するのではなく、「キー」によって値を管理します。
「このキーに対応する値は何?」という質問がすぐにできるわけです。

例えるなら、学生名簿で「田中さんの電話番号は?」と聞いたらすぐ答えられるようなものです。

2. 高速な検索性能

HashMapTreeMapといった実装クラスでは、内部的に効率の良い仕組み(たとえばハッシュテーブル)を使っています。

これにより、大量のデータがあっても、値の検索がすばやく(理論上は一定時間)行えるようになっています。

3. 柔軟なデータ管理

Mapはさまざまな型のデータに対応していて、必要に応じて自由にキーや値を設定できます。
また、キーを使って値を追加・削除・検索などが簡単にできます。


HashMapとは?〜最もよく使われるMapの実装〜

HashMapの基本

HashMapは、Mapインターフェースを実装した最も代表的なクラスです。

その特長をまとめると:

特性内容
一意なキー同じキーは1つだけ。あとからputすると上書きになります。
値の重複可値は同じでもOK。たとえば「AさんもBさんも20歳」など。
順序は保証されない挿入順とは関係なく取り出されます。
高速操作要素の追加・取得・削除が高速(計算量は O(1))です。

基本コードと動作の確認

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

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();

        map.put("Apple", 10);          // 値の追加
        map.put("Banana", 20);

        System.out.println(map.get("Apple"));  // 出力:10

        map.remove("Apple");           // Appleを削除

        System.out.println(map.containsKey("Apple"));  // 出力:false
        System.out.println(map.containsValue(20));     // 出力:true

        System.out.println(map.size());        // 出力:1
    }
}


よく使うメソッドと意味

メソッド説明
put(K key, V value)キーと値をMapに追加。キーがあれば上書き。
get(Object key)指定したキーの値を取得。なければnullが返る。
remove(Object key)指定キーのエントリを削除。
containsKey(Object k)キーが存在するかどうか調べる。
containsValue(Object v)値が存在するかどうか調べる。
size()Mapに含まれるエントリー(ペア)の数を返す。
clear()すべてのエントリーを削除。
isEmpty()要素が1つもなければtrueを返す。

MapとArrayListを組み合わせると何ができる?

単体でも便利なMapですが、ArrayListと組み合わせるとさらに強力です。

たとえば、「複数人のプロフィール情報をリスト形式で保持したい」という場合:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        List<Map<String, String>> list = new ArrayList<>();

        Map<String, String> map1 = new HashMap<>();
        map1.put("name", "John");
        map1.put("age", "20");
        list.add(map1);

        Map<String, String> map2 = new HashMap<>();
        map2.put("name", "Mary");
        map2.put("age", "25");
        list.add(map2);

        for (Map<String, String> map : list) {
            System.out.println(map);
        }
    }
}

上記では、List<Map<...>>という構造を使って、「リストの中に複数のMap(=辞書のような情報)」を保持しています。
これはJSON形式のようなネストされたデータを扱う際にもとても便利です。


図で理解する:MapとListの関係

List
├── Map({"name": "John", "age": "20"})
└── Map({"name": "Mary", "age": "25"})
  • Listが「人の並び順」を保持
  • Mapが「人ごとの情報(名前や年齢)」を保持

まるで**名簿(List)の中に個人情報(Map)**があるような構造ですね。


Mapの計算量と効率性について

プログラミングでは、操作にかかる時間(計算量)を ビッグオー記法(Big-O notation) で表現します。

HashMapの主な操作とその計算量は以下のとおりです:

操作計算量
put()O(1)(オーダー1)
get()O(1)
remove()O(1)

この「O(1)」というのは、「データ量が増えても、操作にかかる時間はほぼ一定」という意味です。
これが、HashMapが高速で優秀とされる理由の一つです。


よくある落とし穴

  • nullキーは1つだけ使える:HashMapは1つだけnullキーを許します。
  • スレッドセーフではない:マルチスレッド環境ではConcurrentHashMapを使いましょう。
  • 順序が保証されない:順序を大切にしたい場合はLinkedHashMapTreeMapを使いましょう。

まとめ:Mapはプログラミングに欠かせない武器!

Mapは、「あるものと別のものを関連付けたい」というあらゆる場面で活躍します。

  • 人の名前と電話番号
  • 商品コードと在庫数
  • URLとページ内容

などなど、現実の情報構造とも非常に相性がいいのです。


次に学ぶべきこと

次のステップとして、以下の内容を学んでみてください。

  1. Mapの実装クラスの違い
    • HashMap, TreeMap, LinkedHashMap, ConcurrentHashMap
  2. Mapの繰り返し処理
    • entrySet()keySet()を使ったループ処理
  3. Mapを使った実践的なアプリ作成
    • 連絡帳アプリ、カート管理システムなど

「Mapが使える」と一言で言っても、現場では応用力が問われます。
まずは基本をしっかり押さえて、少しずつ実践に応用していきましょう!

いつでも質問してくださいね!

以上、HashMapをご紹介しました。

最後までお読みいただきありがとうございます。