Java EnumMap完全マスター:Enumをキーとした効率的なマッピング
Java EnumMap
このチュートリアルでは、JavaのEnumMapクラスとその操作を例とともに学習します。
JavaコレクションフレームワークのEnumMapクラスは、enum要素のためのマップ実装を提供します。
EnumMapでは、enum要素がキーとして使用されます。Mapインターフェースを実装します。

EnumMapを学ぶ前に、Java Enumについて理解しておいてください。
EnumMapの作成
enumマップを作成するには、まずjava.util.EnumMapパッケージをインポートする必要があります。インポート後、以下のようにJavaでenumマップを作成できます。
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
上記の例では、sizesというenumマップを作成しました。
ここで、
- Size - 値にマッピングされるenumのキー
- Integer - 対応するキーに関連付けられるenumマップの値
EnumMapのメソッド
EnumMapクラスは、enumマップ上でさまざまな操作を実行するメソッドを提供します。
EnumMapへの要素挿入
put()- 指定されたキー/値マッピング(エントリ)をenumマップに挿入putAll()- 指定マップのすべてのエントリをこのマップに挿入
例:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size enumのEnumMapを作成
EnumMap<Size, Integer> sizes1 = new EnumMap<>(Size.class);
// put()メソッドの使用
sizes1.put(Size.SMALL, 28);
sizes1.put(Size.MEDIUM, 32);
System.out.println("EnumMap1: " + sizes1);
EnumMap<Size, Integer> sizes2 = new EnumMap<>(Size.class);
// putAll()メソッドの使用
sizes2.putAll(sizes1);
sizes2.put(Size.LARGE, 36);
System.out.println("EnumMap2: " + sizes2);
}
}
出力
EnumMap1: {SMALL=28, MEDIUM=32}
EnumMap2: {SMALL=28, MEDIUM=32, LARGE=36}
上記例では、putAll()メソッドでenumマップsizes1のすべての要素をenumマップsizes2に挿入しました。
HashMap、TreeMapなどの他のマップからputAll()でenumマップに要素を挿入することも可能です。ただし、すべてのマップは同じenum型である必要があります。
EnumMap要素へのアクセス
1. entrySet()、keySet()、values()の使用
entrySet()- enumマップのすべてのキー/値マッピング(エントリ)のセットを返すkeySet()- enumマップのすべてのキーのセットを返すvalues()- enumマップのすべての値のセットを返す
例:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size enumのEnumMapを作成
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// entrySet()メソッドの使用
System.out.println("キー/値マッピング: " + sizes.entrySet());
// keySet()メソッドの使用
System.out.println("キー: " + sizes.keySet());
// values()メソッドの使用
System.out.println("値: " + sizes.values());
}
}
出力
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
キー/値マッピング: [SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40]
キー: [SMALL, MEDIUM, LARGE, EXTRALARGE]
値: [28, 32, 36, 40]
2. get()メソッドの使用
get()メソッドは、指定されたキーに関連付けられた値を返します。指定キーが見つからない場合はnullを返します。
例:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size enumのEnumMapを作成
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// get()メソッドの使用
int value = sizes.get(Size.MEDIUM);
System.out.println("MEDIUMの値: " + value);
}
}
出力
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
MEDIUMの値: 32
EnumMap要素の削除
remove(key)- 指定キーに関連付けられたエントリをマップから削除して返すremove(key, value)- 指定キーが指定値にマッピングされている場合のみエントリを削除し、boolean値を返す
例:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size enumのEnumMapを作成
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// remove()メソッドの使用
int value = sizes.remove(Size.MEDIUM);
System.out.println("削除された値: " + value);
boolean result = sizes.remove(Size.SMALL, 28);
System.out.println("{SMALL=28}のエントリは削除されたか? " + result);
System.out.println("更新後のEnumMap: " + sizes);
}
}
出力
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
削除された値: 32
{SMALL=28}のエントリは削除されたか? True
更新後のEnumMap: {LARGE=36, EXTRALARGE=40}
EnumMap要素の置換
replace(key, value)- 指定keyに関連付けられた値を新しいvalueで置換replace(key, old, new)- old値が指定keyに既に関連付けられている場合のみ、old値をnew値で置換replaceAll(function)- マップの各値を指定functionの結果で置換
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Size enumのEnumMapを作成
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// replace()メソッドの使用
sizes.replace(Size.MEDIUM, 30);
sizes.replace(Size.LARGE, 36, 34);
System.out.println("replace()使用後のEnumMap: " + sizes);
// replaceAll()メソッドの使用
sizes.replaceAll((key, oldValue) -> oldValue + 3);
System.out.println("replaceAll()使用後のEnumMap: " + sizes);
}
}
出力
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40}
replace()使用後のEnumMap: {SMALL=28, MEDIUM=30, LARGE=34, EXTRALARGE=40}
replaceAll()使用後のEnumMap: {SMALL=31, MEDIUM=33, LARGE=37, EXTRALARGE=43}
上記プログラムで、以下のステートメントに注目してください:
sizes.replaceAll((key, oldValue) -> oldValue + 3);
ここでは、メソッドがマップのすべてのエントリにアクセスし、ラムダ式で提供される新しい値で全値を置換します。
その他のメソッド
| メソッド | 説明 |
|---|---|
clone() | EnumMapのコピーを作成 |
containsKey() | 指定キーをEnumMapで検索しboolean結果を返す |
containsValue() | 指定値をEnumMapで検索しboolean結果を返す |
size() | EnumMapのサイズを返す |
clear() | EnumMapからすべてのエントリを削除 |
EnumSet vs EnumMap
EnumSetとEnumMapの両クラスはenum値を格納するデータ構造を提供します。しかし、いくつかの主要な違いがあります。
- EnumSetは内部的にビット列として表現されるのに対し、EnumMapは内部的に配列として表現される
- EnumSetは
allOf()、noneOf()、of()などの定義済みメソッドで作成される。一方、EnumMapはコンストラクタで作成される
CloneableおよびSerializableインターフェース
EnumMapクラスはCloneableとSerializableインターフェースも実装します。
Cloneableインターフェース
クラスのインスタンスのコピーを作成することを可能にします。
Serializableインターフェース
Javaオブジェクトをネットワーク経由で送信する際、オブジェクトをビットやバイトに変換する必要があります。これはJavaオブジェクトを直接ネットワーク送信できないためです。
Serializableインターフェースはクラスの直列化を可能にします。つまり、Serializableを実装するクラスのオブジェクトをビットやバイトに変換できます。
Java
- C言語 列挙型(Enum)マスター: 定義・宣言・フラグ操作
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Java Enum完全ガイド:列挙型とEnumクラスの活用法
- Java Enumコンストラクタ徹底解説:実践例で理解する
- Java Enumの文字列表現マスター:デフォルト、オーバーライド、高度なパターン
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法