在探索Java EnumSet时,我介绍了两个package-private类,


RegularEnumSet
巨型枚举集


从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的性能稍好一些,因为它的间接性要少一些(它将所有数据存储在对象中,而不必去检索单独的数组来查找其数据),而操作要少一些(它不会必须找到数组索引)等等。(我不知道这些东西在实践中有多重要,但是我敢肯定,如果没有理由,他们将不会实现这种方法。)

07-26 02:02