Java 数组哈希码实现

2022-08-31 17:32:12

这很奇怪。一位同事询问了myArray.hashCode()在java中的实现。我以为我知道,但后来我进行了一些测试。检查下面的代码。我注意到的奇怪的是,当我写出第一个系统时,结果是不同的。请注意,这几乎就像它报告内存地址并修改类移动地址或其他内容一样。只是以为我会分享。

int[] foo = new int[100000];
java.util.Random rand = new java.util.Random();

for(int a = 0; a < foo.length; a++) foo[a] = rand.nextInt();

int[] bar = new int[100000];
int[] baz = new int[100000];
int[] bax = new int[100000];
for(int a = 0; a < foo.length; a++) bar[a] = baz[a] = bax[a] = foo[a];

System.out.println(foo.hashCode() + " ----- " + bar.hashCode() + " ----- " + baz.hashCode() +  " ----- " + bax.hashCode());

// returns 4097744 ----- 328041 ----- 2083945 ----- 2438296
// Consistently unless you modify the class.  Very weird
// Before adding the comments below it returned this:
// 4177328 ----- 4097744 ----- 328041 ----- 2083945


System.out.println("Equal ?? " +
  (java.util.Arrays.equals(foo, bar) && java.util.Arrays.equals(bar, baz) &&
  java.util.Arrays.equals(baz, bax) && java.util.Arrays.equals(foo, bax)));

答案 1

该方法继承自 ,这意味着哈希码依赖于引用。要获取基于数组内容的哈希码,请使用 。java.lang.ArrayhashCodeObjectArrays.hashCode

请注意,尽管这是一个浅层哈希码实现。还存在深度实现。Arrays.deepHashCode


答案 2

数组使用默认哈希代码,该代码基于内存位置(但它不一定是内存位置,因为它只是一个,并且所有内存地址都不适合)。您还可以通过打印 的结果来查看这一点。intSystem.identityHashCode(foo)

数组仅当它们是相同的、相同的数组时才存在。因此,数组哈希代码通常只相等,如果它们是相同的,相同的数组。equal