使用HashMap作为另一个HashMap的键

9
我有一个需求,需要将一组配置映射到一组值上,理想情况下使用Map<Map<String, Object>, Map<String, Object>>结构表示。
主Map中的配置和值都是任意的,因此我无法使用具体的类。
请提供一些关于这种结构的反馈。可以将Map用作另一个Map的键吗?经过一些研究,我发现Map的equals方法利用所有基础键和值来判断两个Map是否相等。此外,Map的HashCode基于Map的键的HashCode。我认为这足以满足将Map用作键的最低要求。
在我开始实现之前,我仍然希望有人验证一下。如果有更好的解决方案/设计可以建议,欢迎提出。
编辑:
最终,我使用一个简单的波浪号(“~”)和管道符(“|”)分隔的字符串作为键,并在需要时对其进行拆分。感谢所有给予帮助的人。

7
你并没有那个要求,你只是认为自己有而已。 - Raedwald
你可能可以通过某种方式将其拼凑在一起,但我认为你应该退后一步,并确信你不能使用String或Pojo作为键。 - Murat Karagöz
3
将地图的组合映射成为一个线索,表明您需要创建一些单独的类。 - Arnaud Denoyelle
我最终使用了一个简单的波浪号('~')和管道('|')分隔的字符串。强制类型转换键使我感到悲哀:'( - 如果您有结构化数据,请使用结构化类型(即专用键类型),而不是将该结构嵌入字符串中。 [`@AutoValue](https://github.com/google/auto/tree/master/value)使快速定义此类类型非常容易。 - dimo414
1个回答

22

是的,一个HashMap可以作为另一个映射表的键来使用,因为该类正确地重写了.equals().hashCode()方法。

然而,一般来说,使用可变类型(如HashMap)作为Map键或Set元素是一个不好的做法,因为如果对象在集合中被修改,就会违反这些类所期望的不变量。

虽然不完全符合您的要求,Guava 提供了几个 额外的数据结构,例如 MultisetMultiMapBiMapTable,这些可能会有用。他们还提供了 不可变集合,例如 ImmutableMap,由于它们无法被改变,因此在使用作为 Map 键时更安全。这并不是说您应该这样做,只是说这样做是安全的(如果键和值也是不可变的)。
考虑发布一个问题来探讨导致您得出需要 Map<Map<K, V>, Map<K, V>> 结构的问题。您可能会得到更好的答案来回答那个问题。

这非常有道理。我完全忽略了不可变性。将研究不可变集合。 - Sumit
1
@Sumit,很高兴能帮忙,但请考虑替代的数据结构——嵌套映射通常是代码异味,并且很快就会变得难以处理。 - dimo414

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接