1. 程式人生 > 其它 >hashCode()和equals()的區別

hashCode()和equals()的區別

引言

下面從兩個角度來介紹他們的區別:效能和可靠性。他們的區別也主要體現在這兩個方面

equals()既然已經能實現對比,為什麼還要hashCode()?

因為重寫的equals()裡一般比較的比較全面且複雜,這樣效率比較低,而利用hashCode()進行對比,只需要生成一個hash值進行比較就可以了,效率比較高。

hashCode()效率那麼高,為什麼還要equals()?

因為hashCode()並不完全可靠,有時候不同物件他們生成的hashcode也會一樣,所以hahscode大部分時候是可靠,並不是絕對可靠。所以得到以下兩條結論:

  • equals()相等的兩個物件他們的hashCode()肯定相等
  • hashCode()相等的兩個物件他們的equals()不一定相等。

拓展

阿里巴巴規定:只要重寫equals(),就必須重寫hashCode()

因為Set儲存的是不重複物件,依據hashCode和equals進行判斷,所以Set儲存的物件必須重寫這兩個方法;如果自定義物件做Map的鍵,那麼必須重寫hashCode和equals

什麼時候需要重寫?

一般不需要過載hashCode(),只有當類需要放在HashTable、HashMap、HashSet等hash結構的集合時,才需要過載hashCode()

那麼為什麼要過載hashCode()呢?

如果你重寫了equals,比如說是基於物件的內容實現的,而保留hashCode的實現不變,那麼很可能某兩個物件明明是“相等”,而hashCode卻不一樣。這樣,當你用其中的一個作為鍵儲存到hashMap、hasoTable或hashSet中,再以“相等的”找另一個作為鍵值去查詢他們的時候,則根本找不到。

為什麼equals()相等,hashCode就一定要相等,而hashCode()相等,卻不要求equals()相等?

因為是按照hashCode來訪問小記憶體塊,所以hashCode必須相等。HashMap獲取一個物件是比較key的hashCode相等和equals為true。之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那麼hashCode都以name計算,所以hashCode一樣,但是兩個物件屬於不同型別,所以equals為false。

為什麼需要hashCode()?

通過hashCode可以很快的查到小記憶體塊。通過hashCode比較比equals方法快,當get時先比較hashCode,如果hashCode不同,直接返回false。