這很奇怪。一位同事詢問了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)方法?有沒有什麼好的理由? – 2013-05-07 21:05:24
由於hashCode需要快速有用(因爲它主要用於防止昂貴的.equals調用),甚至數組上的淺值hashCode可能會非常緩慢。一個基本上是隨機的hashCode不會傷害,它只是沒有優勢。一小部分的罪惡。 – Torque 2013-11-28 03:31:58