2015-11-03 150 views
1

在探索的Java EnumSet,我碰到凸轮2 包私人类,为什么EnumSet使用不同大小的RegularEnumSet和JumboEnumSet。它对性能有什么影响?

  1. RegularEnumSet
  2. JumboEnumSet

从EnumSet来源:

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

而且RegularE numSet构造是这样的:

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背后的逻辑是什么?

回答

3
  • RegularEnumSet使用单个long作为其位阵列,所以它仅保持64位,所以它只能跟踪多达64个枚举值的存在或不存在的。
  • JumboEnumSet使用long[],所以它可以保持任意多位,所以它可以跟踪任意多枚举值的存在或不存在。

RegularEnumSet稍有更好的性能,因为它有一点点不太间接(它存储的对象中的所有数据,而不必去获取一个单独的数组中找到它的数据),少一点位操作(它不需要找到数组索引)等等(我不知道这些东西在实践中有多重要,但是我相信如果它没有正当理由,他们就不会实现这种方法。)

相关问题