我被告知Object.hashCode()可以返回不同的哈希,即使内容相同,例如数组[1,2],并且不能依赖它来验证对象的一致性。我的理解是我的Array的内容是相同的然后我会得到相同的哈希回来,即使在不同的jvm?
我问的原因是我想:
我认为只是做Array.hashCode()就可以完成这项工作,但我现在充满怀疑!
答案 0 :(得分:3)
数组不会覆盖hashCode
,这意味着您将获得默认的"身份哈希码"。两个相同的数组将(可能)为您提供不同的哈希码,并且更改数组的内容不会更改其哈希码。
但是,您可以使用静态方法Arrays.hashCode(yourArray)
。相关文档说明返回值等于Arrays.asList(yourArray).hashCode()
和all lists are guaranteed to use the same hash algorithm。这意味着Arrays.hashCode
将在不同的JVM上返回一致的哈希码,只要数组的元素在不同的JVM上具有一致的哈希码。
答案 1 :(得分:2)
使用其中一个静态方法Arrays.hashCode
而不是Object
的默认实现hashCode
(这是数组对象使用的实现)会给你什么需要,因为它根据数组的元素计算哈希码,所以两个包含相同顺序的相同元素的数组会产生相同的hashCode。
答案 2 :(得分:2)
不,java.lang.Object.hashCode()
并不总是在多个JVM中返回相同的值;更糟糕的是,当您再次停止并启动JVM时,对Object.hashCode()
的调用可能会返回与上一次运行不同的值。
请注意,Object.hashCode()
不会根据对象的内容自动计算哈希码。因此对于具有相同内容的两个数组,哈希码很可能是不同的:
int[] one = new int[]{1,2};
int[] two = new int[]{1,2};
System.out.println(one.hashCode());
System.out.println(two.hashCode());
打印出来(例如;当你运行它时,你很可能得到不同的数字):
1725154839
1670675563
使用Arrays.hashCode(array)
作为Eran和immibis建议您是否需要基于数组内容的哈希码:
System.out.println(Arrays.hashCode(one));
System.out.println(Arrays.hashCode(two));
打印:
994
994
请注意,Arrays.hashCode()
与直接调用数组上的hashCode()
不同。