有点奇怪。一位同事问我在Java中如何实现myArray.hashCode(),我认为我知道,但之后我跑了几个测试。请查看下面的代码。我注意到的奇怪之处是,在我写第一个sys out时,结果不同。请注意,它几乎像是报告了一个内存地址,修改类移动了地址或其他什么东西。只是想分享一下。
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)));
bar.equals(baz)
使用引用相等。当人们使用Arrays.equals(foo, bar)
确定相等性时,问题就出现了,然后 不 使用Arrays.hashCode(foo)
以获得哈希码。如果您正在使用java.util.Arrays
中的方法进行相等性比较,则需要对哈希码也使用它们。 - Daniel Martin