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