不同时重写equals和hashCode又会怎样?
作者:flyhero
微信公眾號:碼上實戰(ID:Push-Code)
可能一問到equals和hashCode相關的問題,就會有人講他們的自反性,對稱性,一致性,傳遞性等幾條約定了,此時我不得不佩服,這么多約定竟然都能記得,但我不知道你是不是真的理解呢。
一、我不同時重寫又能如何呢?
我只能說只要你不碰到這幾個主,你也沒什么事的!
1、為什么不能遇到它們幾個呢?
因為它們幾個會用到hashCode方法。
2、他們用hashCode方法來干嘛?
hashCode方法是根據對象的地址生成的一個int整數,默認它和地址一一對應的,如果不重寫,那么只有對象地址一樣的情況下,哈希值才相等。
equals默認用來比較地址是否相同,但當集合中元素增多時,再使用equals判斷,效率是比較低的;而哈希值是可以快速定位到指定的元素的,所以默認Java就使用哈希值來比較定位,因此有了Object.hashCode的約定。
Set怎么實現存儲不重復的元素的?HashMap怎么判斷相同的key的?有興趣可去深入了解一下。
二、例子
小王在「堆」中有兩套房產,這兩套房產位于不同的地址。現在我想要判斷這兩套房子是否是同一個主人?
于是我去問Object,而Object告訴我這兩套房產不是一個人的!
我:為什么呢?
Object: equals告訴我兩套房子離了十萬八千里,在不同的地方(地址),當然不是同一個人了。
我:這邏輯……(不符合我們常規的認知啊)
既然這樣,那我只能重寫equals了!
哈哈,好啦,現在equals終于知道這兩個房子是同一人的啦!
然而在房產管理局(HashMap)我得到一個消息:小王只要一套房產!
WTF!我白干了!
房產管理局(HashMap): 不信你看!
遇到你真是倒霉了,原來房產管理局(HashMap)使用了hashCode來計算的!想要正確的統計小王的房產只能重寫hashCode方法了。
此時,他們統計終于對了!!!
三、總結
除非你能保證你重寫equals的類不被Set,Map使用,否則你就必須同時重寫equals和hashCode。
你能保證嗎?如果不想同時重寫,你可以這樣:
信不信這樣寫,老大看到后,就say goodbye了!
四、如何重寫equals與hashCode
我就不寫出常說的那些約定性質了,寫了也記不住。說說如何避免違反這些約定:
1、重寫equals
-
????通過==判斷是否是同一個引用
-
????通過instanceof判斷是否是相同類型
-
????把參數轉為正確的類型
-
????對比雙方各個屬性值是否相同
如:
2、重寫hashCode
hashCode方法應該為“不相等的對象產生不相等的哈希值”
一般計算是根據你equals中用來比較的屬性的hashCode組合計算的,不過目前JDK和一些類庫已經給我提供了很好的重寫方式,我們可不必去深究其中算法。
方式一:
使用了JDK自帶Objects提供的靜態方法。
方式二:
使用了lombok類庫,直接在類上注解即可。
另外,大家可以參考一篇文章:《看似簡單的hashCode和equals面試題,竟然有這么多坑!》
總結
以上是生活随笔為你收集整理的不同时重写equals和hashCode又会怎样?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你这辈子可能都不需要看《计算机程序设计艺
- 下一篇: If语句:你们到底想把我放到哪儿?