为什么EnumSet或EnumMap可能比它们的哈希值更高效?

以下内容来自EnumMap的Java doc的Implementation Note部分:

实施说明:所有基本操作都在恒定时间内执行。 它们很可能(虽然不能保证)比它们的HashMap对应物更快。

我在EnumSet的java doc中也看到过类似的行。 我想知道为什么EnumSetsEnumMaps更有可能比他们的哈希同行更快?

EnumSet由位数组支持。 由于您可以预先知道EnumSet可以放入的不同项目的数量,因此我们可以为每个枚举值保留一位。 您可以想象SetSet类似优化,但是对于Set (对于2 ^ 32位需要0.5 GiB的内存)或者通常情况下它是不可行的。

因此,基本操作就像existsadd常量时间(就像HashSet一样),但它们只需要检查或设置一位。 没有hashCode()计算。 这就是EnumSet速度更快的原因。 还有更复杂的操作,如union,或使用位操作技术轻松实现。

在OpenJDK中有两个EnumSet实现: RegularEnumSet能够处理枚举,长度最多64个值, JumboEnumSet用于更大的枚举(使用long[] )。 但它只是一个实现细节。

EnumMap工作原理类似,但它使用Object[]来存储值,而key(index)是从Enum.ordinal()隐式推断出来的。