hashcode()和equals()

一般都會這麼問,hashcode()相等的兩個類一定想等麼?equals()相等的呢?反過來呢?
首先,equals()是Object類裏的方法,如果沒有重寫的話調用的就是Object類裏的,用的就是==,直接就比較內存地址了,所以如果這個想等了那麼一定是想等的,因爲就是同一塊內存。
如果重寫了equals()的話,那就不知道怎麼回事了,畢竟可以在方法裏寫成跟一切都想等。

hashcode()方法,用來比較類相不相等根本沒有價值,首先這個東西只有在需要散列的時候纔會用到,也就是說往HashSet、HashMap這種數據結構裏面塞東西的時候纔會去做hash來確定把這個東西扔到哪個格子裏。這種情況下重複的東西還是挺多的。
如果自定義的類,作爲key的話,必須要實現hashcode()方法,因爲Object類的hashcode()方法,是一個native方法。

hashCode 的常規協定是:
在 Java 應用程序執行期間,在同一對象上多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是對象上 equals 比較中所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。

重寫hashcode()方法的原因:
主要原因是默認從Object繼承來的hashCode是基於對象的ID實現的。
如果你重寫了equals,比如說是基於對象的內容實現的,而保留hashCode的實現不變,那麼很可能某兩個對象明明是“相等”,而hashCode卻不一樣。
這樣,當你用其中的一個作爲鍵保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一個作爲鍵值去查找他們的時候,則根本找不到。

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