如何搞懂equals和hashCode

如何搞懂equals和hashCode,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

網(wǎng)站制作、網(wǎng)站建設(shè)的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)公司一個(gè)展示的機(jī)會(huì)來證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。

. == 和 equals的區(qū)別

==被我們常用來比較基本數(shù)據(jù)類型的值,對(duì)于比較對(duì)象時(shí)我們一般是使用equals方法的,我們知道所有的類都是繼承自O(shè)bject類的。其實(shí)在Object中的equals方法就是使用==來比較的。

也就是說==也是可以用來比較對(duì)象的,正如Object類中一樣。但是如果用雙等號(hào)比較對(duì)象,比較的是對(duì)象在內(nèi)存中的地址,而不是值。所以一般在我們的業(yè)務(wù)場景中,例如:

1public class House {
2    private int houseShape;// 房子戶型
3    pirvate long houseSize;// 房子大小
4    private int houseArea; // 房子地段
5    ...
6}
 

例如上面一個(gè)類House.java,如果我們比較兩個(gè)House相等。應(yīng)該是在他的house的地段,大小,戶型等等屬性都相等的時(shí)候就可以認(rèn)為這兩間房子是等價(jià)的。
那么對(duì)于這種類型對(duì)象的比較,顯然用雙等號(hào)是不合適的,這時(shí)候我們應(yīng)該重寫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}
   

. 重寫equals就一定要重寫hashCode嗎?

答案是:否!

首先hashCode我們可以理解為對(duì)象的地址(根據(jù)地址生成的hash碼),只要new一個(gè)對(duì)象出來,hashCode就應(yīng)該不相同。一般情況下,我們確實(shí)不用管hashCode方法。但是當(dāng)我們需要將對(duì)象存放入某些數(shù)據(jù)結(jié)構(gòu)中時(shí),例如HashSet,這時(shí)候當(dāng)我們重寫了equals就必須重寫hashCode了。這是為什么呢?因?yàn)樵谶@種數(shù)據(jù)結(jié)構(gòu)中,不允許重復(fù)存儲(chǔ)兩個(gè)相等的對(duì)象,那它怎么去判斷兩個(gè)對(duì)象是否相同呢?有人講,可以使用equals方法嘛,根本不需要hashCode??!不錯(cuò),使用equals方法確實(shí)可以判斷。但是你想過沒有,如果有幾千萬條數(shù)據(jù),難道每增加一條數(shù)據(jù)就和之前的所有數(shù)據(jù)通過equals方法比較一下嗎?肯定不是的,所以設(shè)計(jì)HashSet結(jié)構(gòu)的大師就想到了通過對(duì)象的地址來判斷,同一個(gè)地址肯定只有一個(gè)對(duì)象咯,只要有新的對(duì)象添加進(jìn)來直接找到內(nèi)存的對(duì)應(yīng)地址上不就行了。正因?yàn)榇髱熥隽巳绱说那擅畹脑O(shè)計(jì),所以當(dāng)我們要將數(shù)據(jù)放到Hash結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)中時(shí),就必須確保當(dāng)我們使用equals判斷是相等的對(duì)象,就應(yīng)該擁有相同的內(nèi)存地址即相同的hashCode。

反之,當(dāng)equals判斷為不相等的對(duì)象其hashCode也應(yīng)該不相等。所以我們同時(shí)重寫equals方法和hashCode方法就是為了保證這一點(diǎn)。

看完上述內(nèi)容,你們掌握如何搞懂equals和hashCode的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

本文名稱:如何搞懂equals和hashCode
本文地址:http://muchs.cn/article34/jpgspe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)、用戶體驗(yàn)、做網(wǎng)站動(dòng)態(tài)網(wǎng)站、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)