Java Map 哈希码

5

如果一个Map包含了StringIntegerObject[]等类型的值,那么计算它的哈希码应该采用哪种方式最佳?

Map.hashCode()返回的是浅层哈希码。这意味着如果你在map中有一个String[]Map.hashCode()也会使用String[]返回的哈希码。但不幸的是,我想要的是Object.hashCode()的实现。而我想要的是Arrays.hashCode(String[])的实现。

那么,处理这个问题的最佳通用方法是什么?


1
我假设你的Map是不可变的?如果你正在添加/删除条目,那么基于值的hashCode()注定会失败。 - Kirk Woll
1
@Kirk Woll:请详细说明,有什么意义? - javaq
@John Gardner:我需要知道两个地图是否在深度上以通用的方式保持相同的值。 - javaq
2
@javaq,hashCode并不能保证两个maps相等 -- 你打错方向了。两个不同值的对象 可能 返回相同的hashCode()。如果你想进行深度相等比较,那你只能自己实现 equals 方法。 - Kirk Woll
还要注意,地图可以包含它们自己...小心不要递归无限计算哈希码 :) - Steven Schlansker
显示剩余2条评论
2个回答

9
如果您需要知道两个映射是否包含相同的值,则需要编写深度比较方法。在这种情况下,您不应该依赖hashCode。
即使使用完美的算法,也没有办法用单个有符号整数唯一地表示每个可能对象的每个可能集合。
当在集合中使用时,hashcode仅用于减少碰撞,而不应用于唯一地标识对象。

谢谢。你知道实现我的目标的其他有效方法吗? - javaq
1
如果您需要知道两个集合是否完全相同,除了进行深度比较外,没有其他真正的方法。不同之处可能会很快失败,但最坏的情况始终是比较每个内部对象,包括每个内部集合的内部比较... - John Gardner

3

你的问题的解决方案是不要使用数组,而是使用ArrayLists(或其他形式的List,比如Google的Guava中的ImmutableList)。Lists可以按照你想要的方式进行哈希。此外,数组与泛型(如Maps)并不兼容。


这不是一个解决方案。我无法控制输入。最终,我可以递归地将数组替换为数组列表,但我会避免这样做。 - javaq

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