以下来自EnumMap 的 Java 文档的实施说明部分:
实施说明:所有基本操作都在恒定时间内执行。它们很可能(尽管不能保证)比它们的 HashMap 对应物更快。
我在 java 文档中EnumSet
也看到了类似的行。我想知道为什么它比散列对应物更有可能EnumSets
并且EnumMaps
会更快?
以下来自EnumMap 的 Java 文档的实施说明部分:
实施说明:所有基本操作都在恒定时间内执行。它们很可能(尽管不能保证)比它们的 HashMap 对应物更快。
我在 java 文档中EnumSet
也看到了类似的行。我想知道为什么它比散列对应物更有可能EnumSets
并且EnumMaps
会更快?
EnumSet
由位数组支持。由于您可以预先知道可以放入的不同项目的数量EnumSet
,因此我们可以简单地为每个枚举值保留一位。您可以想象对Set<Byte>
or进行类似的优化,但对于(2^32 位需要 0.5 GiB 的内存)或一般来说Set<Short>
,这是不可行的。Set<Integer>
因此,基本操作如exists
或add
ar 常量时间(就像HashSet
),但它们只需要检查或设置一位。没有hashCode()
计算。这就是为什么EnumSet
更快。还有更复杂的操作,如联合或使用位操作技术轻松实现。
在 OpenJDK 中,有两种实现EnumSet
:RegularEnumSet
能够处理具有多达 64 个值的long
枚举和JumboEnumSet
更大的枚举(使用long[]
)。但这只是一个实现细节。
EnumMap
工作原理类似,但它用于Object[]
存储值,而键(索引)是从Enum.ordinal()
.
EnumSet
在内部使用 array[] 和自然顺序,从而产生以下后果:
hashCode()
不用于找到正确的存储桶EnumMap
使用 Enum 作为密钥,基于与EnumSet
不可能发生哈希码冲突的相同原则