JavaのEnumMapクラスとは?特徴・コンストラクタ・使い方を徹底解説
java.util.EnumMap クラスは、enum(列挙型)のキー専用に設計された特殊な Map 実装です。一般的な HashMap と比べて軽量かつ高速に動作するため、enum をキーとして扱う場面では第一の選択肢となります。
EnumMapの主な特徴
キーは単一のenum型に限定される: EnumMapに格納できるすべてのキーは、マップ作成時に明示的または暗黙的に指定された、同一のenum型から取得する必要があります。異なるenum型のキーを混在させることはできません。
自然順序で維持される: EnumMapは、キーとなっているenum定数が宣言された順序(自然順序)でエントリを保持します。そのため、要素の並び順が常に安定しています。
非同期(スレッドセーフではない): EnumMapは同期化されていません。複数のスレッドが同時にアクセスし、少なくとも1つのスレッドがマップを変更する可能性がある場合は、外部で同期処理を行う必要があります。例えば
Collections.synchronizedMap()でラップする方法があります。
EnumMapのコンストラクタ一覧
EnumMapクラスには、以下の3つのコンストラクタが用意されています。
| 番号 | コンストラクタと説明 |
|---|---|
| 1 | EnumMap(Class<K> keyType) 指定されたキー型を持つ空のEnumMapを作成します。最も基本的なコンストラクタです。 |
| 2 | EnumMap(EnumMap<K,? extends V> m) 指定されたEnumMapと同じキー型を持ち、同じマッピング(存在する場合)を初期内容として含むEnumMapを作成します。 |
| 3 | EnumMap(Map<K,? extends V> m) 指定されたマップの内容で初期化されたEnumMapを作成します。元のマップが空の場合は、引数なしで生成された場合と同様の結果になります。 |
使用例1:clone()メソッドによるマップの複製
まず、clone() メソッドを使ってEnumMapを複製する例を見てみましょう。
import java.util.EnumMap;
public class Demo {
// enumの定義
public enum Numbers {
ONE, TWO, THREE, FOUR, FIVE
};
public static void main(String[] args) {
EnumMap<Numbers, String> map1 = new EnumMap<>(Numbers.class);
EnumMap<Numbers, String> map2 = new EnumMap<>(Numbers.class);
// map1に値を関連付ける
map1.put(Numbers.ONE, "1");
map1.put(Numbers.TWO, "2");
map1.put(Numbers.THREE, "3");
map1.put(Numbers.FOUR, "4");
// マップ全体を出力
System.out.println("map1:" + map1);
// map1をmap2へ複製
map2 = map1.clone();
// map2を出力
System.out.println("map2:" + map2);
}
}
実行結果
map1:{ONE=1, TWO=2, THREE=3, FOUR=4}
map2:{ONE=1, TWO=2, THREE=3, FOUR=4}
clone() によって、map1と同じ内容を持つmap2が作成されていることが確認できます。出力結果では、enumの宣言順序どおりに要素が並んでいる点にも注目してください。
使用例2:size()メソッドでマッピング数を確認
次に、マップ内のキーと値のマッピング数を size() メソッドで表示する例です。
import java.util.*;
public class EnumMapDemo {
// enumの定義
public enum Numbers {
ONE, TWO, THREE, FOUR, FIVE
};
public static void main(String[] args) {
EnumMap<Numbers, String> map = new EnumMap<>(Numbers.class);
// マップに値を関連付ける
map.put(Numbers.ONE, "1");
map.put(Numbers.TWO, "2");
map.put(Numbers.THREE, "3");
map.put(Numbers.FOUR, "4");
// マップの内容を出力
System.out.println("Map: " + map);
// 現在のマッピング数を出力
System.out.println("Number of mappings:" + map.size());
// 新しいエントリを追加
map.put(Numbers.FIVE, "5");
// 追加後のマッピング数を出力
System.out.println("Number of mappings:" + map.size());
}
}
実行結果
Map: {ONE=1, TWO=2, THREE=3, FOUR=4}
Number of mappings:4
Number of mappings:5
このように、put() で新しいエントリを追加すると、size() の戻り値もそれに応じて変化します。
まとめ
EnumMapは、enumをキーとするマップが必要な場面において、メモリ効率とパフォーマンスに優れた選択肢です。内部では配列を使用して実装されており、ハッシュ計算が不要なため高速に動作します。ただし、スレッドセーフではない点には注意し、マルチスレッド環境では適切な同期処理を組み合わせて使用しましょう。
-
Javaのsuperキーワードとは?使い方とサンプルコードを徹底解説
JavaのsuperキーワードとはJavaにおけるsuperキーワードは、サブクラスから直接の親クラス(スーパークラス)のメンバーやコンストラクタへアクセスするために使われる重要なキーワードです。主な役割は以下の3つです。親クラスのインスタンス参照:super変数は、直近の親クラスのインスタンスを参照します。親クラスのメソッド呼び出し:superを使うことで、オーバーライドされた親クラスのメソッドを呼び出せます。親クラスのコンストラクタ呼び出し:super()は親クラスのコンストラクタとして機能し、子クラスのコンストラクタ内では必ず最初の行に記述する必要があります。特に、オーバーライドされたメ
-
Javaの集約(Aggregation)とは?HAS-A関係の基本をわかりやすく解説
Javaにおける集約(Aggregation)とは、オブジェクト指向プログラミングにおける「HAS-A関係」を表す概念です。あるクラスが、別のクラスのオブジェクトを「持っている(has-a)」という関係性を指します。まずは具体的な例を見てみましょう。集約のコード例public class Vehicle{} public class Speed{} public class Van extends Vehicle { private Speed sp; }この例では、VanクラスがSpeedクラスのインスタンスをフィールドとして保持しています。つまり、「VanはSpeedを持っている(