hashcode()和equals()理解

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() 

 

參考:https://blog.csdn.net/xl_1803/article/details/80445481?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章