13

以下は、 EnumMap の Java doc の実装ノートセクションからのものです。

実装上の注意: すべての基本操作は一定時間内に実行されます。対応する HashMap よりも高速である可能性があります (保証はされていません)。

Java doc にEnumSetも同様の行がありました。なぜその可能性が高く、ハッシュされた対応物よりも高速になるのEnumSetsか知りたいですか?EnumMaps

4

2 に答える 2

19

EnumSetビット配列によって支えられています。入れることができるさまざまな項目の数はEnumSet事前にわかっているので、列挙値ごとに 1 ビットを予約するだけです。Set<Byte>またはに対して同様の最適化を想像することはできますが、 (2^32 ビットで 0.5 GiB のメモリが必要です) または一般的にSet<Short>は実現できません。Set<Integer>

したがって、existsまたはのような基本的な操作はadd一定時間 ( のようにHashSet) ですが、単に 1 つのビットを調べたり設定したりする必要があります。hashCode()計算なし。EnumSetこれが速い理由です。また、ユニオンなどのより複雑な操作や、ビット操作技術を使用して簡単に実装することもできます。

OpenJDK には の 2 つの実装EnumSetありRegularEnumSetます。しかし、それは単なる実装の詳細です。longJumboEnumSetlong[]

EnumMap. _ Object[]_Enum.ordinal()

于 2013-01-26T11:57:29.487 に答える