以下内容来自Java doc of EnumMap的实施说明部分:
实施说明:所有基本操作都在恒定时间内执行。 他们很可能(虽然不能保证)比他们更快 HashMap同行。
我在EnumSet
的java文档中也看到过类似的行。我想知道为什么EnumSets
和EnumMaps
更有可能比他们的哈希对手更快?
答案 0 :(得分:14)
EnumSet
由位数组支持。由于您可以预先知道EnumSet
中可以放入的不同项目的数量,因此我们可以为每个枚举值保留一位。您可以想象Set<Byte>
或Set<Short>
的类似优化,但对于Set<Integer>
(对于2 ^ 32位需要0.5 GiB的内存)或一般来说,它是不可行的。
因此exists
或add
等基本操作是恒定时间(就像HashSet
),但它们只需要检查或设置一位。没有hashCode()
计算。这就是EnumSet
更快的原因。还有更复杂的操作,比如union或使用位操作技术轻松实现。
在OpenJDK中有两个EnumSet
实现:RegularEnumSet
能够处理枚举,最多64个值in long
和JumboEnumSet
更大的枚举(使用long[]
})。但这只是一个实现细节。
EnumMap
适用于类似的原则,但它使用Object[]
来存储值,而密钥(index)是从Enum.ordinal()
隐式推断的。
答案 1 :(得分:0)
EnumSet
在内部使用array []并使用自然顺序,从而导致后果:
hashCode()
不用于查找正确的存储桶 EnumMap
使用Enum作为密钥,基于与EnumSet
相同的原理,其中不可能发生哈希码冲突