これは奇妙です。同僚がjavaのmyArray.hashCode()の実装について質問しました。私は知っていると思ったが、その後いくつかのテストを行った。以下のコードを確認してください。奇妙なことに気付いたのは、私が最初のシステムを書いたときに結果が異なっていたということです。それはメモリアドレスを報告しているようなもので、クラスを変更するとアドレスや何かを移動したようなものです。ちょうど私が共有すると思った。Java Arrayの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)));
感謝を参照してくださいが、 java.lang.Arrayは、デフォルトでhashCode(およびtoString)メソッドをオーバーライドしないのはなぜですか?何か良い理由はありますか? –
hashCodeは高速である必要があり(大部分は高価な.equalsの呼び出しを防ぐために使用されるため)、配列上の浅い値のhashCodeさえも非常に遅い可能性があります。基本的にランダムなhashCodeは害を与えません。ただ利点がありません。 2つの悪のうちの小さい方。 – Torque