JavaのMapとHashMapを基礎から解説!新人気分でスッキリ理解しよう
今回は、Javaでよく使われる「Map(マップ)」とその代表的な実装である「HashMap(ハッシュマップ)」について、初心者の方でも理解できるようにじっくり解説していきます。
「Mapって、なんか難しそう…」という方もご安心ください。たとえば、英語と日本語の単語帳をイメージすると、かなり近い概念なんですよ!
Mapとは?〜キーと値でデータを結びつける仕組み〜
Mapは「辞書」のようなもの
JavaのMap
インターフェースは、キー(Key)と値(Value)をセットにして保存するデータ構造です。
たとえば、次のような感じです:
キー(英単語) | 値(意味) |
---|---|
apple | りんご |
banana | バナナ |
これ、まさに英和辞書そのものですね。
英語でいう"map"は「地図」という意味が有名ですが、動詞としての"map"は「関連づける」という意味があります。JavaにおけるMapも「あるキー(名前など)と、ある値(年齢など)を関連づける」ために使われます。
Mapの3つの特長
1. キーと値のペアで管理
Mapはリストや配列と違って、「順番」で管理するのではなく、「キー」によって値を管理します。
「このキーに対応する値は何?」という質問がすぐにできるわけです。
例えるなら、学生名簿で「田中さんの電話番号は?」と聞いたらすぐ答えられるようなものです。
2. 高速な検索性能
HashMap
やTreeMap
といった実装クラスでは、内部的に効率の良い仕組み(たとえばハッシュテーブル)を使っています。
これにより、大量のデータがあっても、値の検索がすばやく(理論上は一定時間)行えるようになっています。
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
を使いましょう。 - 順序が保証されない:順序を大切にしたい場合は
LinkedHashMap
やTreeMap
を使いましょう。
まとめ:Mapはプログラミングに欠かせない武器!
Mapは、「あるものと別のものを関連付けたい」というあらゆる場面で活躍します。
- 人の名前と電話番号
- 商品コードと在庫数
- URLとページ内容
などなど、現実の情報構造とも非常に相性がいいのです。
次に学ぶべきこと
次のステップとして、以下の内容を学んでみてください。
- Mapの実装クラスの違い
HashMap
,TreeMap
,LinkedHashMap
,ConcurrentHashMap
- Mapの繰り返し処理
entrySet()
やkeySet()
を使ったループ処理
- Mapを使った実践的なアプリ作成
- 連絡帳アプリ、カート管理システムなど
「Mapが使える」と一言で言っても、現場では応用力が問われます。
まずは基本をしっかり押さえて、少しずつ実践に応用していきましょう!
いつでも質問してくださいね!
以上、HashMapをご紹介しました。