Java String類的hashCode()函數

來源:互聯網
上載者:User

標籤:

1 ==和equals()

==比較兩個對象是否指向同一個記憶體位址。

equals()方法判斷兩個對象的值是否相等。

2 String.equals()

String類對equals()方法重寫如下:

 1     public boolean equals(Object anObject) { 2         if (this == anObject) { 3             return true; 4         } 5         if (anObject instanceof String) { 6             String anotherString = (String) anObject; 7             int n = value.length; 8             if (n == anotherString.value.length) { 9                 char v1[] = value;10                 char v2[] = anotherString.value;11                 int i = 0;12                 while (n-- != 0) {13                     if (v1[i] != v2[i])14                             return false;15                     i++;16                 }17                 return true;18             }19         }20         return false;21     }

String、StringBuffer及StringBuilder是兩兩不equals()的。

3 String.hashCode()

判斷對象值是否相等時,會先判斷其hashCode是否相等。如果hashCode不相等,則equals()方法返回false;不然,再進行比較。

jvm預設hashCode不相等,則對象值也不相等。其逆反命題是:若對象值相等,則其hashCode也相等。

重寫equals()時,必須也重寫hashCode()。並且需要保證,值相等的對象,有相同的hashCode。

 1     public int hashCode() { 2         int h = hash; 3         if (h == 0 && value.length > 0) { 4             char val[] = value; 5  6             for (int i = 0; i < value.length; i++) { 7                 h = 31 * h + val[i]; 8             } 9             hash = h;10         }11         return h;12     }

這裡魔法數字選擇31的原因是

* 因為乘以2是移位計算,在乘法溢出時,資訊就會丟失,所以不能選擇2和2的倍數(2k和k的效果一樣,但2k的計算量更大)。

* 素數可以使得散列的分布更加均勻。

* 31是大於26的素數中,最容易計算的(移位減法)。

這裡第一條和第三條的含義是自現的,而第二條,目前還沒有明確的證明。

起碼在某些hashCode計算方法下,合數並不比素數更容易衝突。

比如,hashCode = value % size

Java String類的hashCode()函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.