0

我发现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。否则,将使用JumboEnumSet代替。

这里我的问题如下:

  1. 这个枚举的限制数(64)是怎么来的,或者怎么计算为64?
  2. 为什么同时使用RegularEnumSetJumboEnumSet,这样做有什么好处?
4

2 回答 2

3

它不限于 64 个。如果项目超过 64 个,则选择不同的实现。我没有查看源代码,但我猜 aRegularEnumSet是使用单个long.

于 2013-11-11T13:22:01.723 回答
1

它不是,它仅限于 enum 中可用的不同类型:

枚举集合中的所有元素都必须来自一个枚举类型,该枚举类型在创建集合时显式或隐式指定。

于 2013-11-11T13:18:26.763 回答