2015-11-03 145 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稍有更好的性能,因爲它有一點點不太間接(它存儲的對象中的所有數據,而不必去獲取一個單獨的數組中找到它的數據),少一點位操作(它不需要找到數組索引)等等(我不知道這些東西在實踐中有多重要,但是我相信如果它沒有正當理由,他們就不會實現這種方法。)

相關問題