2010-12-10 68 views
2

这是计算Map的哈希码的最佳途径,知道它可能包含的类型,如项值:StringIntegerObject[] ...?的Java地图哈希码

Map.hashCode()返回一个浅的散列码。这意味着如果您的地图中有String[],则Map.hashCode()也将使用String[]返回的散列。不幸的是,这不是我想要的(Object.hashCode()实现)。但我想要Arrays.hashCode(String[])实施。

那么最好的,通用的方法来处理呢?

+1

我认为你的地图是不可变的?如果你添加/删除条目,你的基于值的hashCode()是注定的。 – 2010-12-10 17:37:17

+0

我想大多数人最初的问题将是“为什么?”你在做什么,你需要改变地图的哈希码?计算一个“深”哈希码可能会使该操作相当昂贵... – 2010-12-10 17:37:22

+1

@Kirk Woll:请详细说明,这有什么意义? – javaq 2010-12-10 17:40:01

回答

5

如果您需要知道两个地图是否包含相同的值,则需要编写一个深度比较方法。你不应该依赖于hashCode。即使使用完美的算法,也不可能每个可能的对象的每个可能的集合都可以由一个有符号的整数唯一地表示。

Hashcode方法仅仅是碰撞减少在收藏时,它不应该被用来唯一标识对象。

+0

谢谢。你知道任何其他有效的方法来实现我的目标吗? – javaq 2010-12-10 19:21:01

+1

如果您需要知道两个集合*完全相同,除深度比较之外没有其他方法可以实现。 *不相同的东西可能会很快失败,但最坏的情况是总是比较每个内部对象,包括每个内部集合的内部比较...... – 2010-12-10 19:33:03

3

你的问题的解决方案是不使用数组。使用ArrayLists(或其他形式的List,就像Google Guava的ImmutableList一样)。列表哈希你想要的方式。另外,数组并不真正适合泛型(比如Maps)。

+0

这不是一个解决方案。我无法控制输入。最终我可以递归地用数组列表替换数组,但是我会避免这种情况。 – javaq 2010-12-10 17:38:05