[英]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.