在探索 Java EnumSet 时,我遇到了两个package-private类,
- 正则枚举集
- 巨型枚举集
来自 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/