为什么EnumSet或EnumMap可能比它们的哈希对应物更具性能?

时间:2013-01-26 11:53:02

标签: java enums enumset enum-map

以下内容来自Java doc of EnumMap实施说明部分:

  

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

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

2 个答案:

答案 0 :(得分:14)

EnumSet由位数组支持。由于您可以预先知道EnumSet中可以放入的不同项目的数量,因此我们可以为每个枚举值保留一位。您可以想象Set<Byte>Set<Short>的类似优化,但对于Set<Integer>(对于2 ^ 32位需要0.5 GiB的内存)或一般来说,它是不可行的。

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

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

EnumMap适用于类似的原则,但它使用Object[]来存储值,而密钥(index)是从Enum.ordinal()隐式推断的。

答案 1 :(得分:0)

EnumSet在内部使用array []并使用自然顺序,从而导致后果:

  • 快速:通过固定时间O(1)调用get / set,hashCode()不用于查找正确的存储桶
  • 内存效率:数组的大小由Enum大小预定义,并且不是动态的

EnumMap使用Enum作为密钥,基于与EnumSet相同的原理,其中不可能发生哈希码冲突