1

在探索 Java EnumSet 时,我遇到了两个包私有类,

  1. 正则枚举集
  2. 巨型枚举集

从 EnumSet 来源:

if (universe.length <= 64)
   return new RegularEnumSet<>(elementType, universe);
else
   return new JumboEnumSet<>(elementType, universe);

此外, RegularEnumSet构造函数看起来像:

RegularEnumSet(Class<E>elementType, Enum[] universe) {
    super(elementType, universe);
}

而在JumboEnumSet构造函数的情况下是:

JumboEnumSet(Class<E>elementType, Enum[] universe) {
   super(elementType, universe);
   elements = new long[(universe.length + 63) >>> 6];
}

所以我的疑问是:

  • 为什么它根据大小使用不同的 EnumSet。它如何影响性能?

  • JumboEnumSet 使用元素数组背后的逻辑是什么?

4

1 回答 1

4
  • RegularEnumSet使用 singlelong作为其位数组,因此它仅保存 64 位,因此它只能跟踪最多 64 个枚举值的存在或不存在。
  • JumboEnumSet使用 a long[],因此它可以保存任意多个位,因此它可以跟踪任意多个枚举值的存在或不存在。

RegularEnumSet性能稍好一些,因为它的间接性更少(它将所有数据存储在对象中,而不必去检索一个单独的数组来查找它的数据),更少的位操作(它不必查找数组索引)等(我不知道这些东西在实践中有多重要,但我敢肯定,如果没有理由,他们就不会实施这种方法。)

于 2015-11-03T07:36:57.683 回答