2024.10.11
Java Mapの使い方総まとめ(初期化、ソート、ループ処理の方法も解説)
JavaのMap型は、キーと値のペアでデータを管理する重要なデータ構造です。
本記事では、Mapの基本的な操作から応用方法までを詳しく解説し、効果的な活用方法を紹介します。
それでは、Java言語のMap型について詳しくみていきましょう。
この記事でわかること
- Mapの基本定義と特徴
- 宣言と初期化方法
- 主要メソッドの使い方
- ループ処理の方法
- Java 8以降の便利なメソッド
- ソートとフィルタリング
- 他のコレクションやJSONとの連携
目次
Java言語のMap型とは

Javaのコレクションフレームワークの中でも、Mapはキーと値のペアでデータを管理するための重要なデータ構造です。
ここでは、Mapの基本的な定義と特徴、そしてその利用シーンとメリットについて詳しく解説します。
Mapの定義と基本的な特徴
Mapは、Javaのコレクションフレームワークの一部です。具体的には、各キーに一つの値が関連付けられる形でデータを格納します。
| 特徴 | 詳細 |
|---|---|
| キーと値のペア | Mapは、ユニークなキーとそれに対応する値のペアで構成されています。同じキーに対して異なる値を設定することはできません。 |
| コレクションの種類 | JavaのMapにはいくつかの実装があり、最も一般的なのはHashMap、TreeMap、LinkedHashMapです。それぞれ、キーの順序やデータの挿入順序の保持など、異なる特性を持っています。 |
| nullの許容 | HashMapなど一部のMap実装では、キーおよび値としてnullを許容しますが、TreeMapのような他の実装では許容されません。 |
| 高速なアクセス | キーを使用して値にアクセスするため、データの検索や更新が高速に行えます。特にHashMapはO(1)の時間複雑度でアクセスできることが特徴です。 |
Mapの利用シーンとメリット
Mapは、その特性から多くの利用シーンで役立ちます。以下にいくつかの代表的なシーンとメリットを紹介します。
| 利用シーン | 詳細 |
|---|---|
| データベースのレコード管理 | データベースから取得したレコードを、特定のキー(例えば、ユーザーIDや商品コード)を用いて管理する場合に適しています。これにより、特定のレコードを迅速に検索・更新することが可能です。 |
| 構成設定の管理 | アプリケーションの設定情報をキーと値のペアで管理する際に便利です。設定名をキーとして、設定値を対応する値として保持することで、柔軟に設定情報を管理できます。 |
| カウント機能 | 要素の出現回数をカウントする場合、要素をキー、その出現回数を値としてMapに格納することで、効率的にカウント処理を行えます。 |
| キャッシュの実装 | 頻繁にアクセスされるデータをキャッシュする際に、キーを用いて素早くデータにアクセスできるため、パフォーマンスの向上に寄与します。 |
Mapを利用することで、データの管理がシンプルかつ効率的になり、プログラムの可読性やメンテナンス性も向上します。
これらの特性を活かして、Javaプログラミングにおけるデータ操作をより効率化させられます。
Mapの基本操作

JavaのMapを効果的に利用するためには、基本的な操作方法を理解することが重要です。本章では、Mapの宣言と初期化、そして具体的なHashMapの使用例を紹介します。
Mapの宣言と初期化
JavaにおいてMapを使用するためには、まずその宣言と初期化を行う必要があります。Mapはインターフェースであり、直接インスタンス化することはできないため、具体的な実装クラスを使用します。
最も一般的な実装クラスとしてはHashMapがあります。以下にMapの宣言と初期化の基本的な方法を紹介します。
// Mapインターフェースを使用した宣言 Map<String, Integer> map; // HashMapクラスを使用した初期化 map = new HashMap<>();
上記の例では、キーとしてString型、値としてInteger型を使用するMapを宣言し、HashMapクラスを使用して初期化しています。
特定の型のキーと値のみを許容するように定義できます。また、以下のように宣言と初期化を同時に行うことも可能です。
Map<String, Integer> map = new HashMap<>();
Mapで使用する主要メソッド

JavaのMapには、データを操作するためのさまざまなメソッドが用意されています。ここでは、よく使用される主要なメソッドについて解説します。
putとget
putメソッドは、Mapにキーと値のペアを追加するために使用します。既存のキーに新しい値を追加すると、古い値は上書きされます。
Map<String, Integer> map = new HashMap<>();
// 要素の追加
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);この例では、mapにキー「apple」、「banana」、「cherry」とそれぞれの値を追加しています。
getメソッドは、指定したキーに対応する値を取得するために使用します。キーが存在しない場合はnullが返されます。
// キーに対応する値の取得
int value = map.get("apple");
System.out.println(value); // 出力: 1keySet、values、entrySet
keySetメソッドは、Mapに含まれるすべてのキーをセットとして取得します。
Set keys = map.keySet();
for (String key : keys) {
System.out.println(key);
}上記の例では、mapに含まれるすべてのキーが出力されます。
valuesメソッドは、Mapに含まれるすべての値をコレクションとして取得します。
Collection values = map.values();
for (Integer value : values) {
System.out.println(value);
}ここでは、mapに含まれるすべての値が出力されます。
entrySetメソッドは、Mapに含まれるすべてのキーと値のペアをセットとして取得します。
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}この例では、mapに含まれるすべてのキーと値のペアが出力されます。
clearとremove
clearメソッドは、Mapに含まれるすべての要素を削除します。これにより、Mapは空になります。
// すべての要素の削除 map.clear(); System.out.println(map.size()); // 出力: 0
上記の通り、mapのすべての要素が削除され、そのサイズは0として出力されます。
removeメソッドは、指定したキーに対応する要素を削除します。キーが存在しない場合は何も起こりません。
// 特定の要素の削除
map.remove("banana");
System.out.println(map.containsKey("banana")); // 出力: false
// 特定の要素の削除
map.remove("banana");
System.out.println(map.containsKey("banana")); // 出力: false上記では、キー「banana」に対応する要素がmapから削除されます。
以上が、Mapでよく使用される主要なメソッドの解説です。これらのメソッドを理解し活用することで、Mapの操作がより効率的に行えるようになります。
Mapの応用方法

Mapを効果的に活用するためには、基本操作に加えて応用的な操作方法を理解することが重要です。
ここでは、Mapを用いたループ処理とJava 8以降の便利なメソッドについて詳しく解説します。
Mapを用いたループ処理
Mapの要素を効率的に操作するために、ループ処理は欠かせません。以降では、for文、Iterator、forEach、ラムダ式を用いたループ処理方法を解説します。
for文とIterator
Mapの要素をループ処理するためには、従来のfor文やIteratorを使用する方法があり、Mapのキーと値のペアを順次操作できます。
// for文を使用した例
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
// for文を用いたループ処理
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}上記では、entrySet()メソッドを使ってMapのエントリを取得し、for文でループ処理を行っています。
// Iteratorを使用した例
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}ここでは、Iteratorを使用してMapのエントリを順次処理しています。iteratorのhasNext()メソッドで次の要素があるかを確認し、next()メソッドで次のエントリを取得します。
forEachとラムダ式
Java 8以降では、forEachメソッドとラムダ式を使ってより簡潔にループ処理を行うことができます。
// forEachメソッドとラムダ式を使用した例
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
// forEachメソッドとラムダ式を用いたループ処理
map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));この例では、forEachメソッドを使用して、Mapの各エントリに対してラムダ式を適用しています。これにより、コードがシンプルで読みやすくなります。
Java 8以降の便利なメソッド
Java 8以降、Mapにはいくつかの便利なメソッドが追加されました。これらのメソッドを活用することで、Mapの操作がさらに効率的になります。
putIfAbsent、replace、computeIfAbsent
putIfAbsentは、指定されたキーが存在しない場合にのみ、指定された値を挿入します。以下のように記述します。
map.putIfAbsent("apple", 5);
System.out.println(map.get("apple")); // 出力: 1 (既に存在するため変更なし)replaceは指定されたキーが存在する場合にのみ、値を置き換えます。以下の通り、bananaが10に置き換えられて出力されます。
map.replace("banana", 10);
System.out.println(map.get("banana")); // 出力: 10 (置き換えられた値)
computeIfAbsentは、指定されたキーが存在しない場合に、キーに対応する値を計算して挿入します。
map.computeIfAbsent("date", key -> 4);
System.out.println(map.get("date")); // 出力: 4 (新しいキーに対して計算された値)Java 9のofメソッドとJava 10のcopyOf
Java 9で導入されたofメソッドは、キーと値のペアを指定して不変のMapを簡単に作成するためのメソッドです。ofメソッドを使用することで、定数としてのMapを容易に作成することができます。これは、変更されないことが保証されているデータを扱う際に特に有用です。
import java.util.Map; Map<String, Integer> immutableMap = Map.of( "apple", 1, "banana", 2, "cherry", 3 ); System.out.println(immutableMap);
上記の例では、ofメソッドを使って3つのエントリを持つ不変のMapを作成しています。immutableMapは、作成後に変更(追加、削除、更新)することができません。この特性は、データの一貫性を保つために非常に有用です。
ofメソッドは、最大10個のキーと値のペアを直接指定してMapを作成できます。それ以上の数のペアを指定する場合は、Map.ofEntriesメソッドを使用します。
import java.util.Map;
import java.util.Map.Entry;
Map<String, Integer> largeMap = Map.ofEntries(
Entry.of("apple", 1),
Entry.of("banana", 2),
Entry.of("cherry", 3),
Entry.of("date", 4),
Entry.of("elderberry", 5)
);
System.out.println(largeMap);この例では、5つ以上のエントリを持つ不変のMapを作成するためにMap.ofEntriesメソッドを使用しています。
Java 10で導入されたcopyOfメソッドは、既存のMapから不変のMapを作成するためのメソッドです。このメソッドは、既存のMapの内容をコピーし、そのコピーを不変にします。元のMapが変更されても、影響を与えられなくなります。
import java.util.HashMap;
import java.util.Map;
Map<String, Integer> originalMap = new HashMap<>();
originalMap.put("apple", 1);
originalMap.put("banana", 2);
originalMap.put("cherry", 3);
Map<String, Integer> immutableMap = Map.copyOf(originalMap);
System.out.println(immutableMap);上記では、originalMapの内容をコピーして不変のMapを作成しています。immutableMapは作成後に変更できませんが、originalMapは引き続き変更可能です。
これらのメソッドを活用することで、Mapの操作がより効率的かつ簡潔になります。Java 8以降の新機能を積極的に取り入れ、プログラミングをより効果的に行いましょう。
【上級者向け】Mapの高度な利用方法

JavaのMapを活用する上で、基本的な操作に慣れたら、さらに高度な利用方法を学ぶことで、より複雑なデータ操作が可能になります。
ここでは、Mapのソートとフィルタリング、他のコレクションとの連携について詳しく解説します。
ソートとフィルタリング
Mapのデータを整理するためには、ソートとフィルタリングが欠かせません。本章では、Stream APIを使用してMapのキーや値をソートする方法と、特定の条件でフィルタリングする方法を解説します。
Stream APIを使用した方法
Java 8で導入されたStream APIを使用すると、Mapのエントリを効率的にソートやフィルタリングすることができます。以下に具体的な例を示します。
Mapのエントリをキーでソートする場合、Streamを使ってエントリのセットを取得し、sortedメソッドでキーを基準にソートします。
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
// キーでソート
Map<String, Integer> sortedByKey = map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
sortedByKey.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));この例では、Map.Entry.comparingByKey()を使ってキーを基準にソートし、その結果を新しいLinkedHashMapに収集しています。LinkedHashMapは挿入順序を保持するため、ソートされた順序が保たれます。
Mapのエントリを値でソートする場合も、`Stream`を使ってエントリのセットを取得し、`sorted`メソッドで値を基準にソートします。
// 値でソート
Map<String, Integer> sortedByValue = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
sortedByValue.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));ここでは、Map.Entry.comparingByValue()を使って値を基準にソートし、その結果を新しいLinkedHashMapに収集しています。
Stream APIを使用してMapのエントリを特定の条件でフィルタリングすることも可能です。以下に、値が2以上のエントリをフィルタリングする例を示します。
// 値が2以上のエントリをフィルタリング
Map<String, Integer> filteredMap = map.entrySet().stream()
.filter(entry -> entry.getValue() >= 2)
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue
));
filteredMap.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));上記では、filterメソッドを使用して、値が2以上のエントリのみを収集しています。フィルタリングされた結果も新しいMapとして収集されます。
Stream APIを活用することで、Mapのエントリを柔軟にソートおよびフィルタリングでき、効率的なデータ操作が可能となります。
Mapと他のコレクションとの連携
Mapは他のコレクションと連携して使用することが多く、データ操作の幅が広がります。以降では、MapをListやSetに変換する方法、およびMapとJSONの相互変換について解説します。
ListやSetへの変換
MapのデータをListやSetに変換することは、データ操作の一環として非常に便利です。以下に具体例を示します。
MapのすべてのキーをListに変換することができます。
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
// キーをListに変換
List keyList = map.keySet().stream().collect(Collectors.toList());
keyList.forEach(System.out::println);map.keySet()でキーのセットを取得し、Streamを使って`List`に変換しています。
Mapのすべての値をSetに変換することも可能です。
import java.util.HashSet; import java.util.Map; import java.util.Set; Set valueSet = new HashSet<>(map.values()); valueSet.forEach(System.out::println);
ここでは、map.values()で値のコレクションを取得し、それをHashSetのコンストラクタに渡して変換しています。
Mapのエントリ(キーと値のペア)をListに変換することができます。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
List<Map.Entry<String, Integer>> entryList = new ArrayList<>(map.entrySet());
entryList.forEach(entry -> System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()));上記では、map.entrySet()でエントリのセットを取得し、それをArrayListのコンストラクタに渡して変換しています。
JSONとの相互変換
JSONはデータ交換フォーマットとして広く使用されており、`Map`とJSONの相互変換は非常に重要です。ここでは、Jacksonライブラリを使用した例を紹介します。
Jacksonライブラリを使用して、MapをJSON形式に変換することができます。
import com.fasterxml.jackson.databind.ObjectMapper;
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
ObjectMapper objectMapper = new ObjectMapper();
try {
String json = objectMapper.writeValueAsString(map);
System.out.println(json);
} catch (Exception e) {
e.printStackTrace();
}この例では、ObjectMapperのwriteValueAsStringメソッドを使用して、MapをJSON文字列に変換しています。
同様に、JSON文字列をMapに変換することもできます。
String json = "{\"apple\":1,\"banana\":2,\"cherry\":3}";
try {
Map<String, Integer> mapFromJson = objectMapper.readValue(json, new TypeReference<Map<String, Integer>>(){});
mapFromJson.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
} catch (Exception e) {
e.printStackTrace();
}ObjectMapperのreadValueメソッドを使用して、JSON文字列をMapに変換しています。TypeReferenceを使用して、ジェネリックな型情報を提供します。
これらの方法を使用することで、Mapと他のコレクションやJSON形式との間で柔軟にデータを変換し、様々な用途に対応することができます。
基本操作から応用方法まで理解してMapを活用しよう

本記事では、JavaのMap型について基本から応用まで幅広く解説しました。Mapの定義と特徴、宣言と初期化、主要なメソッド(put、get、keySet、values、entrySet、clear、remove)の使い方を学びました。
これらの知識を活用し、Mapを効果的に使いこなすことで、データの管理と操作がよりスムーズに行えるようになるでしょう。ぜひ、実際のコーディングに役立ててください。
投稿者
-
システム開発、Webサイト制作、ECサイトの構築・運用、デジタルトランスフォーメーション(DX)など、デジタルビジネスに関わる多岐の領域において、最新のトレンド情報や実践的なノウハウを発信してまいります。
新着情報
同じカテゴリの記事
新着記事
人気の記事

