5分鐘搞清楚equals和hashCode

本篇爲雖爲Java基礎知識,但並不是很多人真正的搞清楚了,所以值得您花5分鐘閱讀

. == 和 equals的區別

==被我們常用來比較基本數據類型的值,對於比較對象時我們一般是使用equals方法的,我們知道所有的類都是繼承自Object類的。其實在Object中的equals方法就是使用==來比較的。

也就是說==也是可以用來比較對象的,正如Object類中一樣。但是如果用雙等號比較對象,比較的是對象在內存中的地址,而不是值。所以一般在我們的業務場景中,例如:

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}

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

答案是:否!

首先hashCode我們可以理解爲對象的地址(根據地址生成的hash碼),只要new一個對象出來,hashCode就應該不相同。一般情況下,我們確實不用管hashCode方法。但是當我們需要將對象存放入某些數據結構中時,例如HashSet,這時候當我們重寫了equals就必須重寫hashCode了。這是爲什麼呢?因爲在這種數據結構中,不允許重複存儲兩個相等的對象,那它怎麼去判斷兩個對象是否相同呢?有人講,可以使用equals方法嘛,根本不需要hashCode啊!不錯,使用equals方法確實可以判斷。但是你想過沒有,如果有幾千萬條數據,難道每增加一條數據就和之前的所有數據通過equals方法比較一下嗎?肯定不是的,所以設計HashSet結構的大師就想到了通過對象的地址來判斷,同一個地址肯定只有一個對象咯,只要有新的對象添加進來直接找到內存的對應地址上不就行了。正因爲大師做了如此的巧妙的設計,所以當我們要將數據放到Hash結構的數據結構中時,就必須確保當我們使用equals判斷是相等的對象,就應該擁有相同的內存地址即相同的hashCode。反之,當equals判斷爲不相等的對象其hashCode也應該不相等。所以我們同時重寫equals方法和hashCode方法就是爲了保證這一點。

感覺有收穫就關注吧!????????????

發佈了60 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章