1.hashCode()作用
hashCode() 的作用是獲取哈希碼,也稱爲散列碼;它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode() 定義在JDK的Object.java中,這就意味着Java中的任何類都包含有hashCode()函數。
散列表存儲的是鍵值對(key-value),它的特點是:能根據“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼!(可以快速找到所需要的對象)
Object的hashcode()方法的修飾符爲native,表明該方法是否操作系統實現,java調用操作系統底層代碼獲取哈希值。
public class Object {
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
}
2.爲什麼要有 hashCode()
我們以“HashSet 如何檢查重複”爲例子來說明爲什麼要有 hashCode:
當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他已經加入的對象的 hashcode 值作比較,如果沒有相符的hashcode,HashSet會假設對象沒有重複出現。但是如果發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同。如果兩者相同,HashSet 就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置,這樣我們就大大減少了 equals() 的次數,相應就大大提高了執行速度。
3.hashCode()與equals()的相關規定
- 如果兩個對象相等,則hashcode一定也是相同的
- 兩個對象相等,對兩個對象分別調用equals方法都返回true
- 兩個對象有相同的hashcode值,它們也不一定是相等的,因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋
- hashCode() 的默認行爲是對堆上的對象產生獨特值。如果沒有重寫 hashCode(),則該 class 的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數據)
4.equals()重寫的場景
- 把持久類的實例放入set中(多值關聯時,1對多),實現equals和hashcode
- 重用託管實例時,實現equals和hashcode
- 多個字段組合作爲聯合主鍵,實現equals和hashcode方法
舉例:
假設現在有很多學生對象,默認情況下,要判斷多個學生對象是否相等,需要根據地址判斷,若對象地址相等,那麼對象的實例數據一定是一樣的,但現在我們規定:當學生的姓名、年齡、性別相等時,認爲學生對象是相等的,不一定需要對象地址完全相同,例如學生A對象所在地址爲100,學生A的個人信息爲(姓名:A,性別:女,年齡:18,住址:北京軟件路999號,體重:48),學生A對象所在地址爲388,學生A的個人信息爲(姓名:A,性別:女,年齡:18,住址:廣州暴富路888號,體重:55),這時候如果不重寫Object的equals方法,那麼返回的一定是false不相等,這個時候就需要我們根據自己的需求重寫equals()方法了。
5.重寫equals()方法後爲什麼一定要重寫hashcode()