我发现EnumSet中使用了枚举的限制数(64)。请参阅下面的 EnumSet 源代码中的一种方法(此代码是从 JDK 1.7 捕获的)。
/**
* Creates an empty enum set with the specified element type.
*
* @param elementType the class object of the element type for this enum
* set
* @throws NullPointerException if <tt>elementType</tt> is null
*/
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
从上面的代码中我们可以看到:如果 Enum 数组的长度小于 64,则使用 RegularEnumSet。否则,将改用巨型枚举集。
在这里,我的问题如下:
- 这个限制枚举数 (64) 是如何来的,或者如何计算为 64?
- 为什么同时使用RegularEnumSet和JumboEnumSet,这样做有什么好处?
它不限于 64。 如果项目超过 64 个,则选择不同的实现。 我没有看过源代码,但我猜RegularEnumSet
是使用单个long
实现为位掩码的。
它不是,它仅限于枚举中可用的不同类型:
枚举集中的所有元素都必须来自单个枚举类型 这是在创建集合时显式或隐式指定的。