[英]Map.of vs EnumMap for immutable map with enum keys
EnumMap
使用限制,即映射的所有鍵都將來自同一enum
以獲取性能優勢:
枚舉映射在內部表示為數組。 這種表示非常緊湊和高效。
在這種情況下,鍵和值存儲在單獨的數組中,並且值按序排列。 迭代是通過內部EnumMapIterator
類完成的。
由各種Map.of
方法創建的不可變映射使用限制,即該映射將不會在結構上進行更改以獲取性能優勢。 如果地圖的大小不為0或1,它將使用MapN
內部類,該類還將其條目存儲在數組中。 在這種情況下,該值在其鍵之后的1個索引中存儲。 迭代是通過內部MapNIterator
完成的。
對於大小為2或更大的不可變enum
鍵的映射,哪個可以滿足上述兩個要求,哪個映射的性能更好? (條件可能是空間效率, containsKey
, containsValue
, get
時間效率,以及entrySet
, keySet
和values
迭代效率。)
哪個地圖可提供更好的空間效率以及操作和迭代的時間效率:
containsKey
,containsValue
,get
,entrySet
,keySet
和values
?
您提出1 + 6(或2 * 6,具體取決於理解方式)的問題,這有點太多了。 如果您想確定的答案,則必須專注於一件事並對其進行概要分析(除非您發現一個非常有趣的問題,否則沒人願意為您做這件事)。
EnumMap
的空間效率必須更好。 無需存儲密鑰,因為可以使用共享的枚舉數組。 不需要包含空洞的哈希查找數組 。
可能會有例外,例如基於巨大枚舉的小地圖。
最重要的操作是get
。 使用EnumMap
, 它不涉及查找 ,僅涉及瑣碎的類比較和數組訪問。 使用Map.of(...)
,有一個循環 ,對於枚舉,通常在第一次迭代后終止,因為Enum.hashCode
是IMHO愚蠢的 ,但通常分布良好。
很清楚,因為containsKey
基於相同的查找。
我懷疑,我曾經使用過containsValue
,但是它沒有比線性搜索更聰明的了。 由於漏洞,我期望EnumMap
會取得小小的勝利(需要瑣碎的null測試,但會導致分支預測錯誤)。
其余三個操作不值得查詢,因為它們返回的集合中不包含任何數據,僅指向地圖,即恆定時間操作。 例如, map.keySet().contains(x)
僅委托給map.containsKey()
。
迭代的效率將是一個更有趣的問題,但您沒有提出這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.