繁体   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