13

以下来自EnumMap 的 Java 文档的实施说明部分:

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

我在 java 文档中EnumSet也看到了类似的行。我想知道为什么它比散列对应物更有可能EnumSets并且EnumMaps会更快?

4

2 回答 2

19

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

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

在 OpenJDK 中,有两种实现EnumSetRegularEnumSet能够处理具有多达 64 个值long枚举和JumboEnumSet更大的枚举(使用long[])。但这只是一个实现细节。

EnumMap工作原理类似,但它用于Object[]存储值,而键(索引)是从Enum.ordinal().

于 2013-01-26T11:57:29.487 回答
0

EnumSet在内部使用 array[] 和自然顺序,从而产生以下后果:

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

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

于 2020-04-10T09:08:12.210 回答