您好,登錄后才能下訂單哦!
如何搞懂equals和hashCode,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
. == 和 equals的區(qū)別
==被我們常用來比較基本數(shù)據(jù)類型的值,對于比較對象時我們一般是使用equals方法的,我們知道所有的類都是繼承自Object類的。其實在Object中的equals方法就是使用==來比較的。
也就是說==也是可以用來比較對象的,正如Object類中一樣。但是如果用雙等號比較對象,比較的是對象在內(nèi)存中的地址,而不是值。所以一般在我們的業(yè)務場景中,例如:
1public class House {
2 private int houseShape;// 房子戶型
3 pirvate long houseSize;// 房子大小
4 private int houseArea; // 房子地段
5 ...
6}
例如上面一個類House.java,如果我們比較兩個House相等。應該是在他的house的地段,大小,戶型等等屬性都相等的時候就可以認為這兩間房子是等價的。
那么對于這種類型對象的比較,顯然用雙等號是不合適的,這時候我們應該重寫equals方法:
1public class House {
2 private int houseShape;// 房子戶型
3 pirvate long houseSize;// 房子大小
4 private int houseArea; // 房子地段
5 ...
6
7 @Override
8 public boolean equals(Object obj) {
9 if (obj instanceof House) {
10 House p = (House) obj;
11 return this.houseShape == p.houseShap
12 && this.houseSize == p.houseSize
13 && this.houseArea == p.houseArea;
14 }
15 return super.equals(obj);
16 }
17}
答案是:否!
首先hashCode我們可以理解為對象的地址(根據(jù)地址生成的hash碼),只要new一個對象出來,hashCode就應該不相同。一般情況下,我們確實不用管hashCode方法。但是當我們需要將對象存放入某些數(shù)據(jù)結(jié)構(gòu)中時,例如HashSet,這時候當我們重寫了equals就必須重寫hashCode了。這是為什么呢?因為在這種數(shù)據(jù)結(jié)構(gòu)中,不允許重復存儲兩個相等的對象,那它怎么去判斷兩個對象是否相同呢?有人講,可以使用equals方法嘛,根本不需要hashCode??!不錯,使用equals方法確實可以判斷。但是你想過沒有,如果有幾千萬條數(shù)據(jù),難道每增加一條數(shù)據(jù)就和之前的所有數(shù)據(jù)通過equals方法比較一下嗎?肯定不是的,所以設計HashSet結(jié)構(gòu)的大師就想到了通過對象的地址來判斷,同一個地址肯定只有一個對象咯,只要有新的對象添加進來直接找到內(nèi)存的對應地址上不就行了。正因為大師做了如此的巧妙的設計,所以當我們要將數(shù)據(jù)放到Hash結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)中時,就必須確保當我們使用equals判斷是相等的對象,就應該擁有相同的內(nèi)存地址即相同的hashCode。
反之,當equals判斷為不相等的對象其hashCode也應該不相等。所以我們同時重寫equals方法和hashCode方法就是為了保證這一點。
看完上述內(nèi)容,你們掌握如何搞懂equals和hashCode的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。