1概要


EnumMap

は、

Enum

をキーとした独自の実装です。

このチュートリアルでは、そのプロパティ、一般的なユースケース、そしていつ使うべきかについて説明します。


2プロジェクト設定

曜日をその日のスポーツとマッピングする必要があるという単純な要件を想像してください。

Monday     Soccer
Tuesday    Basketball
Wednesday  Hiking
Thursday   Karate

これにはenumを使うことができます。

public enum DayOfWeek {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

近いうちに表示されるものがマップの鍵となります。


3作成


EnumMap

の探索を始めるには、まずインスタンスを作成する必要があります。

EnumMap<DayOfWeek, String> activityMap = new EnumMap<>(DayOfWeek.class);
activityMap.put(DayOfWeek.MONDAY, "Soccer");

これが、

HashMap

のような、より一般的なものとの最初の違いです。

HashMap

では型のパラメータ化で十分であることに注意してください。これは

__new HashMap <>()で解決できるという意味です。




ただし、


EnumMap

__はコンストラクタ内のキータイプを必要とします



3.1.

__EnumMap

__Copyコンストラクタ


EnumMap

には2つのコピーコンストラクタも付属しています。最初のものは別の

EnumMap

を取ります。

EnumMap<DayOfWeek, String> activityMap = new EnumMap<>(DayOfWeek.class);
activityMap.put(DayOfWeek.MONDAY, "Soccer");
activityMap.put(DayOfWeek.TUESDAY, "Basketball");

EnumMap<DayOfWeek, String> activityMapCopy = new EnumMap<>(dayMap);
assertThat(activityMapCopy.size()).isEqualTo(2);
assertThat(activityMapCopy.get(DayOfWeek.MONDAY)).isEqualTo("Soccer");
assertThat(activityMapCopy.get(DayOfWeek.TUESDAY)).isEqualTo("Basketball");

3.2.

__Map

__Copyコンストラクタ

または、** キーがenumである空でない

Map

がある場合は、それもできます。

Map<DayOfWeek, String> ordinaryMap = new HashMap();
ordinaryMap.put(DayOfWeek.MONDAY, "Soccer");

EnumMap enumMap = new EnumMap(ordinaryMap);
assertThat(enumMap.size()).isEqualTo(1);
assertThat(enumMap.get(DayOfWeek.MONDAY)).isEqualTo("Soccer");


__EnumMap

__が既存のエントリからキータイプを決定できるように、マップは空でない必要があることに注意してください。

指定されたマップが複数の列挙型を含む場合、コンストラクタは

ClassCastException

をスローします。


4要素の追加と取得


EnumMap

をインスタンス化したら、https://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html#put-K-V-[

put()

]メソッドを使用して、スポーツを追加できます。

activityMap.put(DayOfWeek.MONDAY, "Soccer");

それを取得するには、https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#get-java.lang.Object-[

get()

]を使用できます。

assertThat(clubMap.get(DayOfWeek.MONDAY)).isEqualTo("Soccer");


5要素をチェックする

特定の日にマッピングが定義されているかどうかを確認するには、https://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html#containsKey-java.lang.Object-[を使用します。

containsKey()

]:

activityMap.put(DayOfWeek.WEDNESDAY, "Hiking");
assertThat(activityMap.containsKey(DayOfWeek.WEDNESDAY)).isTrue();

そして、特定のスポーツがいずれかのキーにマッピングされているかどうかを確認するには、https://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html#containsValue-java.lang.Object-[

containsValue()

]:

assertThat(activityMap.containsValue("Hiking")).isTrue();

5.1. 値としての

null

  • 現在、

    null



    EnumMap

    の意味的に有効な値です。


null

と「何もしない」を関連付けて、それを土曜日にマッピングしましょう。

assertThat(activityMap.containsKey(DayOfWeek.SATURDAY)).isFalse();
assertThat(activityMap.containsValue(null)).isFalse();
activityMap.put(DayOfWeek.SATURDAY, null);
assertThat(activityMap.containsKey(DayOfWeek.SATURDAY)).isTrue();
assertThat(activityMap.containsValue(null)).isTrue();


6. 要素を削除する

特定の日をマッピング解除するには、単に

remove()

it:

activityMap.put(DayOfWeek.MONDAY, "Soccer");
assertThat(activityMap.remove(DayOfWeek.MONDAY)).isEqualTo("Soccer");
assertThat(activityMap.containsKey(DayOfWeek.MONDAY)).isFalse();

  • ご覧のとおり、https://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html#remove-java.lang.Object-[

    remove(key)

    ]は前の値を返しますキーに関連付けられた値、またはキーのマッピングがなかった場合は


    _null

    _

  • その日が特定のアクティビティにマップされている場合に限り、** 特定の日のマップを解除することもできます。

activityMap.put(DayOfWeek.Monday, "Soccer");
assertThat(activityMap.remove(DayOfWeek.Monday, "Hiking")).isEqualTo(false);
assertThat(activityMap.remove(DayOfWeek.Monday, "Soccer")).isEqualTo(true);



remove(key、value)


削除指定されたキーが現在指定された値にマップされている場合にのみ、指定されたキーのエントリ


7. コレクションビュー

通常のマップと同様に、

EnumMap

と同様に、3つの異なるビューまたはサブコレクションを使用できます。

まず、活動の新しいマップを作成しましょう。

EnumMap<DayOfWeek, String> activityMap = new EnumMap(DayOfWeek.class);
activityMap.put(DayOfWeek.THURSDAY, "Karate");
activityMap.put(DayOfWeek.WEDNESDAY, "Hiking");
activityMap.put(DayOfWeek.MONDAY, "Soccer");

7.1.



アクティビティマップの最初のビューは

__https://docs.oracle.com/javase/8/docs/api/java/util/EnumMap.html#values–[values()]

__whichです。マップ内のすべての値

Collection values = dayMap.values();
assertThat(values)
  .containsExactly("Soccer", "Hiking", "Karate");

  • ここで、

    __ EnumMap


    は順序付きマップです。エントリの順序を決定するために、


    DayOfWeek

    __enumの順序を使用します。

7.2.

keySet

同様に、


keySet()


は、キーのコレクションを列挙順に返します。

Set keys = dayMap.keySet();
assertThat(keys)
        .containsExactly(DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.SATURDAY);

7.3.

entrySet

最後に、


entrySet()


は、マッピングをキーと値のペアで返します。

assertThat(dayMap.entrySet())
    .containsExactly(
        new SimpleEntry(DayOfWeek.MONDAY, "Soccer"),
        new SimpleEntry(DayOfWeek.WEDNESDAY, "Hiking"),
        new SimpleEntry(DayOfWeek.THURSDAY, "Karate")
    );

マップでの注文は確かに手軽になることができます、そして私達は私達のチュートリアルでより深く入りますそれはhttps://www.baeldung.com/java-treemap-vs-hashmap[compares TreeMap to HashMap]。

7.4. ミュータビリティ

  • 元のアクティビティマップに加えた変更は、そのすべてのビューに反映されます。

activityMap.put(DayOfWeek.TUESDAY, "Basketball");
assertThat(values)
    .containsExactly("Soccer", "Basketball", "Hiking", "Karate");

およびその逆;サブビューに加えた変更は、元のアクティビティマップに反映されます。

values.remove("Hiking");
assertThat(activityMap.containsKey(DayOfWeek.WEDNESDAY)).isFalse();
assertThat(activityMap.size()).isEqualTo(3);


EnumMap



__Map

__interfaceと契約するごとに、サブビューは元のマップに基づいています。


8

EnumMap


を使用する場合

8.1. パフォーマンス


Enum

をキーとして使用すると、すべての可能なキーが事前にわかっているので、より高速なハッシュ計算のように、パフォーマンスをさらに最適化することができます。


enum

をキーとして持つことが簡単であるということは、

EnumMap

を、保存と検索のための非常に単純なロジックを備えた単純な古いJava

Array

によってバックアップするだけでよいことを意味します。その一方で、ジェネリックオブジェクトの実装は、ジェネリックオブジェクトをキーとすることに関連する懸念を満たす必要があります。例えば、https://www.baeldung.com/java-hashmap[

HashMap

]

複雑なデータ構造とかなり複雑な保存と検索のロジックが必要

ハッシュ衝突の可能性を満たす。

8.2. 機能性

また、見たように、

__ EnumMap


は順序付けされたマップで、ビューは列挙順に繰り返されます。より複雑なシナリオでも同様の動作をするには、

TreeMap

または

LinkedHashMap__を見てください。

9.まとめ

この記事では、

Map

インターフェースの

EnumMap

実装を調べました。

__Enum


をキーとして使用するときは、


EnumMap

__が便利です。

このチュートリアルで使われているすべての例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[GitHubプロジェクト]にあります。