hashCode介紹:
hashCode()的作用是獲取哈希碼,它實際上是回傳一個int整數,這個哈希碼的作用是確定該物件在哈希表中的索引位置,hashCode()定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode()函式,散串列存盤的是鍵值對(key-value),它的特點是:能根據"鍵"快速的檢索出對應的"值”,這其中就利用到了哈希碼!(可以快速找到所需要的物件)
為什么要有hashCode:
我們以"HashSet如何檢查重復”為例子來說明為什么要有hashCode:
當你把物件加入HashSet時,HashSet 會先計算物件的hashcode 值來判斷物件加入的位置,同時也會與其他已經加入的物件的hashcode 值作比較,如果沒有相符的hashcode,HashSet會假設物件沒有重復出現,但是如果發現有相同hashcode值的物件,這時會呼叫equals ()方法來檢查hashcode 相等的物件是否真的相同,如果兩者相同,HashSet 就不會讓其加入操作成功,如果不同的話,就會重新散列到其他位置,這樣我們就大大減少了equals 的次數,相應就大大提高了執行速度,
hashCode是所有java物件的固有方法,如果不多載的話,回傳的實際上是該物件在jvm的堆上的記憶體地址,而不同物件的記憶體地址肯定不同,所以這個hashCode也就肯定不同了,如果多載了的話,由于采用的演算法的問題,有可能導致兩個不同物件的hashCode相同,
注意:
1. 如果兩個物件相等,則hashcode一定也是相同的
2. 兩個物件相等,對兩個物件分別呼叫equals方法都回傳 true
3. 兩個物件有相同的 hashcode值,它們也不一定是相等的
4. equals 方法被覆寫過,則hashCode方法也必須被覆寫(只有當物件存盤在散列結構中,如HashSet、HashMap、HashTable中時才必須重寫hashcode,但是建議都重寫)
原因: hashCode() 的默認行為是對堆上的物件產生獨特值,如果沒有重寫hashCode(),則兩個物件值相等時,hashcode的值卻不相同,此時當存盤與散列結構中是會存盤兩個值一樣的物件,與散列存盤結構的不可重復相違背,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/151690.html
標籤:Java
