以下は、 EnumMap の Java doc の実装ノートセクションからのものです。
実装上の注意: すべての基本操作は一定時間内に実行されます。対応する HashMap よりも高速である可能性があります (保証はされていません)。
Java doc にEnumSet
も同様の行がありました。なぜその可能性が高く、ハッシュされた対応物よりも高速になるのEnumSets
か知りたいですか?EnumMaps
以下は、 EnumMap の Java doc の実装ノートセクションからのものです。
実装上の注意: すべての基本操作は一定時間内に実行されます。対応する HashMap よりも高速である可能性があります (保証はされていません)。
Java doc にEnumSet
も同様の行がありました。なぜその可能性が高く、ハッシュされた対応物よりも高速になるのEnumSets
か知りたいですか?EnumMaps
EnumSet
ビット配列によって支えられています。入れることができるさまざまな項目の数はEnumSet
事前にわかっているので、列挙値ごとに 1 ビットを予約するだけです。Set<Byte>
またはに対して同様の最適化を想像することはできますが、 (2^32 ビットで 0.5 GiB のメモリが必要です) または一般的にSet<Short>
は実現できません。Set<Integer>
したがって、exists
またはのような基本的な操作はadd
一定時間 ( のようにHashSet
) ですが、単に 1 つのビットを調べたり設定したりする必要があります。hashCode()
計算なし。EnumSet
これが速い理由です。また、ユニオンなどのより複雑な操作や、ビット操作技術を使用して簡単に実装することもできます。
OpenJDK には の 2 つの実装EnumSet
がありRegularEnumSet
ます。しかし、それは単なる実装の詳細です。long
JumboEnumSet
long[]
EnumMap
. _ Object[]
_Enum.ordinal()