java 重寫類的equals()和hashCode()方法

今天在用阿里代碼檢查工具檢查項目的時候,發(fā)現(xiàn)了一個警告
Map/Set的key為自定義對象時沛申,必須重寫hashCode和equals
說明為:

1) 只要重寫equals铁材,就必須重寫hashCode奕锌。 ?
2) 因為Set存儲的是不重復(fù)的對象惊暴,依據(jù)hashCode和equals進行判斷,所以Set存儲的對象必須重寫這兩個方法肄鸽。 ?
3) 如果自定義對象做為Map的鍵油啤,那么必須重寫hashCode和equals益咬。

下面是代碼的寫法(偽代碼)

    public void methodDemo(){
        Set<ObjDemo> hashSet = new HashSet();
        hashSet.add(new ObjDemo("1","對象1"));
        hashSet.add(new ObjDemo("2","對象2"));
    }

ObjDemo類很簡單

class ObjDemo{
    private String id;

    private String name;

    public ObjDemo(String id,String name){
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

為什么會報這個警告幽告?

警告中也說明了,因為Set存儲的是不重復(fù)的對象齐唆,依據(jù)hashCode和equals進行判斷冻河,所以Set存儲的對象必須重寫這兩個方法芋绸。

了解hashSet存儲對象的方式,請參考:http://www.reibang.com/p/6cab0fae2403

equals和hashCode的關(guān)系(這個是規(guī)定):
1廷蓉、如果兩個對象相同(即用equals比較返回true)桃犬,那么它們的hashCode值一定要相同;
2土匀、如果兩個對象的hashCode相同形用,它們并不一定相同(即用equals比較返回false)

hashCode()方法是干什么的田度,這里提示了是重寫,那么原來其實是有一個hashCode的乎莉,在Object類中奸笤,這里的hashCode()存放的是對象的內(nèi)存地址
所以我們在存放對象進入hashSet的時候监右,如果不重寫equals()和hashCode(),像下面這段代碼

    public void methodDemo(){
        Set<ObjDemo> hashSet = new HashSet();
        hashSet.add(new ObjDemo("1","對象1"));
        hashSet.add(new ObjDemo("1","對象1"));
    }

其實我們邏輯上放進去的是一個對象秸侣,因為id宠互、name都相等予跌,但是,如果打斷點或者寫個測試方法去輸出hashSet長度的時候,會發(fā)現(xiàn)在hashSet中卻有兩個對象频轿,因為這兩個對象的內(nèi)存地址是不同的烁焙。所以要重寫equals()和hashCode()方法骄蝇。例如根據(jù)id來比較兩個對象是否相等,以及根據(jù)id取hashCode赚窃,在ObjDemo中加入

    @Override
    public boolean equals(Object o) {
        if (o instanceof ObjDemo){
            ObjDemo obj = (ObjDemo)o;
            return id.equals(obj.id);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

這樣往hashSet中放對象時就會根據(jù)id去判斷勒极,不會重復(fù)添加。

面試題:為什么重寫equals()方法要重寫hashCode()方法

從上面的規(guī)定可以知道键痛,如果只重寫了equals()方法不重寫hashCode()方法掀鹅,那么則違反了如果兩個對象相同(即用equals比較返回true)乐尊,那么它們的hashCode值一定要相同

也可以把上面的代碼中的hashCode()方法去掉,添加2個id為1的對象限府,set集合里的數(shù)據(jù)還是為2條胁勺。

所以得出結(jié)論:如果一個類重寫了equals方法但是沒有重寫hashCode方法独旷,那么該類無法結(jié)合所有基于散列的集合(HashMap嵌洼,HashSet)一起正常運作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鳖昌,隨后出現(xiàn)的幾起案子许昨,更是在濱河造成了極大的恐慌,老刑警劉巖莉恼,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件类垫,死亡現(xiàn)場離奇詭異悉患,居然都是意外死亡,警方通過查閱死者的電腦和手機坞淮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門回窘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來市袖,“玉大人苍碟,你說我怎么就攤上這事∠系ぃ” “怎么了蜓肆?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵症概,是天一觀的道長厉颤。 經(jīng)常有香客問我逼友,道長秤涩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮照棋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溶锭。我一直安慰自己符隙,他們只是感情好霹疫,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布丽蝎。 她就那樣靜靜地躺著,像睡著了一般迟几。 火紅的嫁衣襯著肌膚如雪栏笆。 梳的紋絲不亂的頭發(fā)上蛉加,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天针饥,我揣著相機與錄音,去河邊找鬼筷凤。 笑死苞七,一個胖子當著我的面吹牛蹂风,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慎恒,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼融柬,長吁一口氣:“原來是場噩夢啊……” “哼粒氧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起廊敌,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骡澈,失蹤者是張志新(化名)和其女友劉穎掷空,沒想到半個月后坦弟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年氯析,在試婚紗的時候發(fā)現(xiàn)自己被綠了掩缓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遵岩。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡尘执,死狀恐怖正卧,靈堂內(nèi)的尸體忽然破棺而出跪解,到底是詐尸還是另有隱情签孔,我是刑警寧澤饥追,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布但绕,位于F島的核電站惶看,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幅骄。R本人自食惡果不足惜本今,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一挪凑、第九天 我趴在偏房一處隱蔽的房頂上張望逛艰。 院中可真熱鬧,春花似錦唐断、人聲如沸杭抠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枚荣,卻和暖如春啼肩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背害碾。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工慌随, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丸逸。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓椭员,卻偏偏與公主長得像隘击,于是被迫代替她去往敵國和親研铆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354