Object.hashCode() 将在多个 jvm(相同版本)之间保持一致

will Object.hashCode() be consistent across multiple jvm's (same version)

有人告诉我 Object.hashCode() 可以 return 不同的散列,即使内容相同,例如数组 [1,2] 并且不能依赖它验证对象一致性。我的理解是我的数组的内容是相同的,那么即使在不同的 jvm 上,我也会得到相同的散列?

我问的原因是我想:

我以为简单地做 Array.hashCode() 就可以完成这项工作,但我现在充满了疑问!

数组不会覆盖 hashCode,这意味着您将获得默认值 "identity hash code"。两个相同的数组(可能)会给你不同的哈希码,改变数组的内容不会改变它的哈希码。

但是,您可以使用静态方法Arrays.hashCode(yourArray). The documentation for this says that the return value is equal to Arrays.asList(yourArray).hashCode(), and all lists are guaranteed to use the same hash algorithm。也就是说Arrays.hashCodereturn在不同JVM上的哈希码一致,只要数组的元素在不同JVM上哈希码一致即可。

使用其中一种静态方法 Arrays.hashCode 而不是 ObjecthashCode 的默认实现(这是数组对象使用的实现)将为您提供所需的东西,因为它根据数组的元素计算哈希码,所以包含相同顺序的相同元素的两个数组将产生相同的哈希码。

不,java.lang.Object.hashCode() 不会总是 return 跨多个 JVM 的相同值;更糟糕的是,当您停止并再次启动 JVM 时,对 Object.hashCode() 的调用可能 return 与之前的 运行.

不同的值

请注意,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

如果您想要基于数组内容的哈希码,请按照 Eran 和 immibis 的建议使用 Arrays.hashCode(array)

System.out.println(Arrays.hashCode(one));
System.out.println(Arrays.hashCode(two));

打印:

994
994

请注意 Arrays.hashCode() 与直接在数组上调用 hashCode() 不同。