hashCode介紹: hashCode()的作用是獲取哈希碼,它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。hashCode()定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode()函數。散列表存儲的是鍵值對(key-va ...
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 的次數,相應就大大提高了執行速度。
註意:
1. 如果兩個對象相等,則hashcode一定也是相同的
2. 兩個對象相等,對兩個對象分別調用equals方法都返回 true
3. 兩個對象有相同的 hashcode值,它們也不一定是相等的
4. equals 方法被覆蓋過,則hashCode方法也必須被覆蓋(只有當對象存儲在散列結構中,如HashSet、HashMap、HashTable中時才必須重寫hashcode,但是建議都重寫)
原因: hashCode() 的預設行為是對堆上的對象產生獨特值。如果沒有重寫hashCode(),則兩個對象值相等時,hashcode的值卻不相同,此時當存儲與散列結構中是會存儲兩個值一樣的對象,與散列存儲結構的不可重覆相違背。