EnumSet中枚举的限制数是如何产生的?

时间:2013-11-11 13:15:31

标签: java enums enumset

我发现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. 为什么 RegularEnumSet JumboEnumSet 都被使用了,这样做有什么用呢?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)