java - 为什么 EnumSet 对不同的大小使用 RegularEnumSet 和 JumboEnumSet。它如何影响性能?

标签 java collections set enumset

在探索 Java EnumSet 时,我遇到了两个package-private类,

  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 使用元素数组的逻辑是什么?

最佳答案

  • RegularEnumSet使用单个 long作为它的位数组,所以它只包含 64 位,所以它只能跟踪最多 64 个枚举值的存在或不存在。
  • JumboEnumSet使用 long[] ,因此它可以容纳任意多位,因此它可以跟踪任意多枚举值的存在与否。

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

关于java - 为什么 EnumSet 对不同的大小使用 RegularEnumSet 和 JumboEnumSet。它如何影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33493579/

相关文章:

java - Spring Security 3.2 Java配置

python - 如何将 python 集转换为 numpy 数组?

c++ - 如何更新 std::set 的现有元素?

Java Deque 实现无法转换 Item

java - 用反射实现工厂模式

java - 编程以捕获数组中的输入

java - 如何在java中对嵌套列表进行排序

java - 我不明白输出这段代码。 ( map )

c# - 有没有办法将键/值对列表转换为数据传输对象

algorithm - 如何有效地计算小尺寸的条件产品?