Java Array HashCode实现

sou*_*wer 49 java int hashcode

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

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)));
Run Code Online (Sandbox Code Playgroud)

Mah*_*eTo 89

java.lang.Array hashCode方法继承自Object,这意味着哈希码取决于引用.要根据数组的内容使用获取哈希码Arrays.hashCode.

请注意它的浅层哈希码实现.还存在深度实施Arrays.deepHashCode.

  • 因为hashCode需要快速有用(因为它主要用于防止昂贵的.equals调用),甚至数组上的浅值hashCode也可能非常慢.基本上随机的hashCode不会受到伤害,它只是没有优势.两个邪恶中的一小部分. (4认同)

eri*_*son 5

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

数组只有equal在它们是相同的、相同的数组时才是。所以,数组散列码只会相等,通常,如果它们是相同的,相同的数组。