簡體   English   中英

帶枚舉鍵的不可變地圖的Map.of vs EnumMap

[英]Map.of vs EnumMap for immutable map with enum keys

EnumMap使用限制,即映射的所有鍵都將來自同一enum以獲取性能優勢:

枚舉映射在內部表示為數組。 這種表示非常緊湊和高效。

在這種情況下,鍵和值存儲在單獨的數組中,並且值按序排列。 迭代是通過內部EnumMapIterator類完成的。

由各種Map.of方法創建的不可變映射使用限制,即該映射將不會在結構上進行更改以獲取性能優勢。 如果地圖的大小不為0或1,它將使用MapN內部類,該類還將其條目存儲在數組中。 在這種情況下,該值在其鍵之后的1個索引中存儲。 迭代是通過內部MapNIterator完成的。

對於大小為2或更大的不可變enum鍵的映射,哪個可以滿足上述兩個要求,哪個映射的性能更好? (條件可能是空間效率, containsKeycontainsValueget時間效率,以及entrySetkeySetvalues迭代效率。)

哪個地圖可提供更好的空間效率以及操作和迭代的時間效率: containsKeycontainsValuegetentrySetkeySetvalues

您提出1 + 6(或2 * 6,具體取決於理解方式)的問題,這有點太多了。 如果您想確定的答案,則必須專注於一件事並對其進行概要分析(除非您發現一個非常有趣的問題,否則沒人願意為您做這件事)。


EnumMap的空間效率必須更好。 無需存儲密鑰,因為可以使用共享的枚舉數組。 不需要包含空洞的哈希查找數組

可能會有例外,例如基於巨大枚舉的小地圖。


最重要的操作是get 使用EnumMap它不涉及查找 ,僅涉及瑣碎的類比較和數組訪問。 使用Map.of(...) ,有一個循環 ,對於枚舉,通常在第一次迭代后終止,因為Enum.hashCodeIMHO愚蠢的 ,但通常分布良好。

很清楚,因為containsKey基於相同的查找。

我懷疑,我曾經使用過containsValue ,但是它沒有比線性搜索更聰明的了。 由於漏洞,我期望EnumMap會取得小小的勝利(需要瑣碎的null測試,但會導致分支預測錯誤)。

其余三個操作不值得查詢,因為它們返回的集合中不包含任何數據,僅指向地圖,即恆定時間操作。 例如, map.keySet().contains(x)僅委托給map.containsKey()

迭代的效率將是一個更有趣的問題,但您沒有提出這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM