Java中equals()和hashCode()之間的聯(lián)系

java-hashcode-650x369.jpeg

Java超類java.lang.Object定義了兩個(gè)重要方法。

public boolean equals(Object obj)
public int hashCode()

在文章中嗎,我首先會(huì)展示一個(gè)常見錯(cuò)誤的例子,然后解釋equals()和hashCode()工作的聯(lián)系。

1. 一個(gè)常見錯(cuò)誤

下面的例子展示了常見的錯(cuò)誤:

import java.util.HashMap;

public class Apple {
    private String color;

    public Apple(String color) {
        this.color = color;
    }

    public boolean equals(Object obj) {
        if(obj==null) return false;
        if (!(obj instanceof Apple))
        return false;   
        if (obj == this)
            return true;
        return this.color.equals(((Apple) obj).color);
    }

    public static void main(String[] args) {
        Apple a1 = new Apple("green");
        Apple a2 = new Apple("red");

        //hashMap stores apple type and its quantity
        HashMap<Apple, Integer> m = new HashMap<Apple, Integer>();
        m.put(a1, 10);
        m.put(a2, 20);
        System.out.println(m.get(new Apple("green")));
    }
}

在main方法中,創(chuàng)建了一個(gè)紅蘋果和綠蘋果,并放到了HashMap中。然而,當(dāng)要求從HashMap中得到綠蘋果時(shí),綠蘋果卻找不到了。上面的代碼執(zhí)行結(jié)果將會(huì)打印null。

我們?cè)赿ebugger時(shí),檢查HashMap后,可以肯定綠蘋果已經(jīng)被存儲(chǔ)到了hashMap。

hashCode-and-equals-contract-600x268.png

問(wèn)題的原因是什么呢?

2. 問(wèn)題由hashCode()產(chǎn)生

因?yàn)闆](méi)有重寫"hashCode()"方法導(dǎo)致了上面的問(wèn)題。equals()和hashCode()之間的聯(lián)系如下:

  1. 如果兩個(gè)對(duì)象是相等的,那么他們的hash code值必須相等。
  2. 如果兩個(gè)對(duì)象的hash code相等,這兩個(gè)對(duì)象可能相等也可能不相等。

Map背后的思想是為了能夠比線性搜索更快的查找到一個(gè)對(duì)象。

問(wèn)題的解決辦法是往Apple類中添加hashCode方法。

public int hashCode(){
    return this.color.hashCode();   
}
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Java中的equals方法和hashCode方法是Object中的,所以每個(gè)對(duì)象都是有這兩個(gè)方法的,有時(shí)候我們需...
    差不多先生_tl閱讀 1,489評(píng)論 2 6
  • Java.lang.Object 有一個(gè)hashCode()和一個(gè)equals()方法,這兩個(gè)方法在軟件設(shè)計(jì)中扮演...
    寇寇寇先森閱讀 1,803評(píng)論 1 9
  • 搞懂 Java equals 和 hashCode 方法 分析完 Java List 容器的源碼后,本來(lái)想直接進(jìn)入...
    醒著的碼者閱讀 2,366評(píng)論 1 9
  • 生活總不完美,總有辛酸的淚,總有失足的悔,總有幽深的怨,總有抱憾的恨。生活亦很完美,總讓我們淚中帶笑,悔中頓悟,怨...
    楊世京閱讀 116評(píng)論 0 0
  • 看到簡(jiǎn)書上很多秀自己的手機(jī)界面和App,感覺(jué)不錯(cuò),所以我也想分享下我自己的手機(jī)界面和我常用的一些應(yīng)用。 首先說(shuō)說(shuō)我...
    這是另一個(gè)我閱讀 814評(píng)論 0 2

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