1. 程式人生 > 其它 >java基礎之hashCode與equals

java基礎之hashCode與equals

hashCode與equals

為什麼重寫equals時必須重寫hashCode? hashCode():

hashcode()的作用是獲取雜湊碼,也稱為雜湊碼;它實際上是返回int整數,這個雜湊碼的作用是確定該物件在雜湊表中的索引位置。hashCode()定義在JDK的Object.java中,這就意味著java中的任何類都包含有hashCode()函式

散列表儲存的鍵值對(key-value)它的特點是:能根據“鍵”快速的檢索出對應的“值”。這其中就利用了雜湊碼(可以快速找到所需的物件)

為什麼要有hashCode

我們先以HashSet如何檢查重複為例子來說明為什麼要有hashCode:

當你把物件加入hashSet時,HashSet會先計算物件的hashCode值來判斷物件加入的位置,同時也會與其他已經加入物件的hashCode值作比較,如果沒有相符的hashCode,hashCode會假設物件沒有重複出現。但是如果發現有相同的hashCode值的物件,這時會呼叫equals()方法來檢查hashCode相等的物件是否真的相同。如果兩者相同,HashSet就不會讓其加入操作成功;如果不同的話,就會重新雜湊到其他位置。

通過這裡我們可以看出:hashCode()的作用就是獲取雜湊碼,也稱雜湊碼;它實際上是返回一個int整數,這個雜湊碼的作用是確定該物件在雜湊表中的索引位置。hashCode()在散列表中才有用,在其他情況下沒用。

hashCode()與equals()的相關規定:

  1. 如果兩個物件相等,則hashCode一定相等(值);

  2. 兩個物件相等,對兩個物件分別呼叫equals方法都返回true(如果這兩個物件是兩個物件的話,這種情況下一定是重寫了hashCode與equals方法,否則一定不等)

  3. 兩個物件有相同發hashCode值,它們也不一定是相等的(沒有重寫equals方法)

  4. 因此,equals方法被覆蓋過,則hashCode也必須被覆蓋

  5. hashCode的預設行為是對堆上的物件產生獨特值;如果沒有重寫hashCode(),則該class的兩個物件無論如何都不會相等(即使這兩個物件指向相同的資料)