EnumSet由位数组支持。由于您可以
EnumSet预先输入不同项目的数量,因此我们可以简单地为每个枚举值保留一位。您可以想象对
Set<Byte>或进行类似的优化
Set<Short>,但是对于
Set<Integer>(通常需要0.5
GiB的内存来存储2 ^ 32位)或一般而言,这是不可行的。
因此,基本操作就像
exists或设置了
add恒定时间(就像
HashSet),但是它们只需要检查或设置一位。没有
hashCode()计算。这就是为什么
EnumSet更快。还有更复杂的操作(例如并集)或使用位操作技术轻松实现的操作。
在OpenJDK的有两种实现方式
EnumSet:
RegularEnumSet能够处理多达64个值枚举在
long和
JumboEnumSet更大的枚举(使用
long[])。但这只是实现细节。
EnumMap按照类似的原理工作,但是它用于
Object[]存储值,而从中隐式地推断了键(索引)
Enum.ordinal()。



