為什么重寫了equals方法必須重寫hashCode方法

看到一個(gè)公眾號(hào)解釋這個(gè)問題又是畫圖又是講故事的,成功把很多人帶蒙了??赐暌院笪叶加行岩芍暗恼J(rèn)識(shí)了,重新理一遍。
首先看看Object默認(rèn)實(shí)現(xiàn)的equals方法

    public boolean equals(Object obj) {
        return (this == obj);
    }

使用==號(hào),來判斷傳入的參數(shù)和自己是不是同一個(gè)內(nèi)存地址。
如果不重寫equals,那么不同的對(duì)象使用equals來比較返回的是false,因?yàn)閮?nèi)存地址的指向不同。
重寫了equals,自己人為的改變對(duì)象equals方法比較的條件,可以讓內(nèi)存地址不同的對(duì)象,使用equals方法在符合自定義條件的時(shí)候返回true。
舉例 有個(gè)User類,有no和age屬性,現(xiàn)在只要no相等,就認(rèn)為是同一個(gè)人,equals比較返回true,重寫equals方法如下

class User{
 int no;
 int age;

  public boolean equals(Object obj) {
      return (this.no == obj.no);
    }
}

這樣兩個(gè)user對(duì)象使用equals方法,只要no相等,就返回true,認(rèn)為他們是同一個(gè)人。
這樣做有問題嗎?如果不使用Set 或Map等散列表結(jié)構(gòu)去存儲(chǔ)user對(duì)象,是沒有問題的。但是如果是用散列表結(jié)構(gòu)比如HashMap,就會(huì)有問題。
現(xiàn)在有2個(gè)User對(duì)象,user1和user2,no都是1,age隨意。重寫了equals方法如上例。不重寫hashCode方法。
使用一個(gè)HashMap map 存儲(chǔ)

map.put(user1,1)
map.put(user2,2)

這里使用user做key?,F(xiàn)在我用map.get(user1)得到的結(jié)果是什么呢?
預(yù)知后事如何
且聽下回分解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容