使用HashMap作为另一个HashMap的键

时间:2017-02-17 09:23:31

标签: java collections hashmap

我有一个要求,我需要使用一组值映射一组配置,理想情况下用Map<Map<String, Object>, Map<String, Object>>结构表示。

配置和配置主要地图的价值部分是任意的&amp;因此,我无法使用具体的课程。

请提供有关此结构的一些反馈。可以将地图用作另一个地图的关键字。做了一些研究,我能够确定Map的equals方法利用了所有潜在的Key&amp; amp;将两个地图视为相等的值。此外,Map的HashCode基于Map的密钥的Hashcodes。这个IMO应该满足使用Map作为密钥的最低要求。

在我继续实施之前,我仍然希望有人来验证这一点。如果有更好的解决方案/设计,有人可以建议,请随意这样做。

修改

我最终使用了一个简单的代字号(&#39;〜&#39;)&amp; pipe(&#39; |&#39;)将String作为键和&amp;在需要时解构它。感谢所有帮助过的人。

1 个答案:

答案 0 :(得分:16)

是的,HashMap 可以用作另一个地图的关键字,因为该类会正确覆盖.equals().hashCode()

然而,它广泛地说bad idea to use mutable types(例如HashMap)作为Map键或Set元素,因为如果对象发生变异,则违反了这些类所期望的不变量而在集合中。

虽然不是您想要的,但Guava提供了多个additional data structures,例如MultisetMultiMapBiMapTable这可能有用。他们还提供immutable collections,例如ImmutableMap(因为它们不能被突变)更安全地用作Map密钥。这并不是说你应该这样做,只是说它是安全的(如果键和值也是不可变的)。

考虑发布一个问题,探讨导致您得出Map<Map<K, V>, Map<K, V>>结构的问题。你可以得到那个问题的更好答案。