HashCode和equal方法的區(qū)別和聯(lián)系

equals()反映的是對(duì)象或變量具體的值,即兩個(gè)對(duì)象里面包含的值--可能是對(duì)象的引用,也可能是值類型的值。
而hashCode()是對(duì)象或變量通過哈希算法計(jì)算出的哈希值。
之所以有hashCode方法,是因?yàn)樵谂康膶?duì)象比較中,hashCode要比equals來得快,很多集合都用到了hashCode,
比如HashTable。

兩個(gè)obj,如果equals()相等,hashCode()一定相等。
兩個(gè)obj,如果hashCode()相等,equals()不一定相等(Hash散列值有沖突的情況,雖然概率很低)。

所以:

可以考慮在集合中,判斷兩個(gè)對(duì)象是否相等的規(guī)則是:

第一步,如果hashCode()相等,則查看第二步,否則不相等;
第二步,查看equals()是否相等,如果相等,則兩obj相等,否則還是不相等。

  • 首先equals()和hashcode()這兩個(gè)方法都是從object類中繼承過來的。

equals()是對(duì)兩個(gè)對(duì)象的地址值進(jìn)行的比較(即比較引用是否相同)。

hashCode()是一個(gè)本地方法,它的實(shí)現(xiàn)是根據(jù)本地機(jī)器相關(guān)的。

  • Java語言對(duì)equals()的要求如下,這些要求是必須遵循的:

    • 對(duì)稱性:如果x.equals(y)返回是true,那么y.equals(x)也應(yīng)該返回是true。

    • 反射性:x.equals(x)必須返回是true。

    • 類推性:如果x.equals(y)返回是true,而且y.equals(z)返回是true,那么z.equals(x)也應(yīng)該返回是true。

    • 一致性:如果x.equals(y)返回是true,只要x和y內(nèi)容一直不變,不管你重復(fù)x.equals(y)多少次,返回都是true。

    • 任何情況下,x.equals(null),永遠(yuǎn)返回是false;x.equals(和x不同類型的對(duì)象)永遠(yuǎn)返回是false。

  • equals()相等的兩個(gè)對(duì)象,hashcode()一定相等;反過來:hashcode()不等,一定能推出equals()也不等;
    hashcode()相等,equals()可能相等,也可能不等。

1、 為什么要重載equal方法?

答案:因?yàn)镺bject的equal方法默認(rèn)是兩個(gè)對(duì)象的引用的比較,意思就是指向同一內(nèi)存,地址則相等,否則不相等;如果你現(xiàn)在需要利用對(duì)象里面的值來判斷是否相等,則重載equal方法。

2、 為什么重載hashCode方法?

答案:一般的地方不需要重載hashCode,只有當(dāng)類需要放在HashTable、HashMap、HashSet等等hash結(jié)構(gòu)的集合時(shí)才會(huì)重載hashCode,那么為什么要重載hashCode呢?就HashMap來說,好比HashMap就是一個(gè)大內(nèi)存塊,里面有很多小內(nèi)存塊,小內(nèi)存塊里面是一系列的對(duì)象,可以利用hashCode來查找小內(nèi)存塊hashCode%size(小內(nèi)存塊數(shù)量),所以當(dāng)equal相等時(shí),hashCode必須相等,而且如果是object對(duì)象,必須重載hashCode和equal方法。

3、 為什么equals()相等,hashCode就一定要相等,而hashCode相等,卻不要求equals相等?

答案:1、因?yàn)槭前凑説ashCode來訪問小內(nèi)存塊,所以hashCode必須相等。

2、HashMap獲取一個(gè)對(duì)象是比較key的hashCode相等和equal為true。

之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那么hashCode都以name計(jì)算,所以hashCode一樣,但是兩個(gè)對(duì)象屬于不同類型,所以equal為false。

4、 為什么需要hashCode?

1、通過hashCode可以很快的查到小內(nèi)存塊。
2、通過hashCode比較比equal方法快,當(dāng)get時(shí)先比較hashCode,如果hashCode不同,直接返回false。

hashCode()的作用

參考

HashCode和equal方法的區(qū)別和聯(lián)系(一)
HashCode和equal方法的區(qū)別和聯(lián)系(二)

最后編輯于
?著作權(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)容

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