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

equals()反映的是對象或變量具體的值,即兩個對象里面包含的值--可能是對象的引用,也可能是值類型的值。
而hashCode()是對象或變量通過哈希算法計算出的哈希值。
之所以有hashCode方法,是因為在批量的對象比較中,hashCode要比equals來得快,很多集合都用到了hashCode,
比如HashTable。

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

所以:

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

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

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

equals()是對兩個對象的地址值進行的比較(即比較引用是否相同)。

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

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

    • 對稱性:如果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),永遠返回是false;x.equals(和x不同類型的對象)永遠返回是false。

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

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

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

2、 為什么重載hashCode方法?

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

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

答案:1、因為是按照hashCode來訪問小內(nèi)存塊,所以hashCode必須相等。

2、HashMap獲取一個對象是比較key的hashCode相等和equal為true。

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

4、 為什么需要hashCode?

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

hashCode()的作用

參考

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容