56

これは奇妙です。同僚が myArray.hashCode() の Java での実装について尋ねました。私は知っていると思っていましたが、いくつかのテストを実行しました。以下のコードを確認してください。私が気づいた奇妙なことは、最初の 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)));
4

4 に答える 4

1

java.util.Arrays.hashCode (または google guava 汎用ラッパー Objects.hashcode) を使用することに同意しますが、Terracotta を使用している場合は問題が発生する可能性があることに注意してください -このリンクを参照してください

于 2010-10-27T02:46:34.057 に答える