EnumMapのガイド
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プロジェクト]にあります。