談?wù)別quals()和hashcode()

總結(jié)一下:

一、equals的作用

equals() 的作用是 用來判斷兩個(gè)對象是否相等。

equals() 定義在JDK的Object.java中。通過判斷兩個(gè)對象的地址是否相等(即,是否是同一個(gè)對象)來區(qū)分它們是否相等。源碼如下:

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

既然Object.java中定義了equals()方法,這就意味著所有的Java類都實(shí)現(xiàn)了equals()方法,所有的類都可以通過equals()去比較兩個(gè)對象是否相等。

所以根據(jù)“類是否覆蓋equals()方法”,將它分為2類:
(1)沒覆蓋,等價(jià)于“==”,實(shí)際上是比較兩個(gè)對象是不是同一個(gè)對象
(2)覆蓋了,我們可以覆蓋類的equals()方法,來讓equals()通過其它方式比較兩個(gè)對象是否相等。通常的做法是:若兩個(gè)對象的內(nèi)容相等,則equals()方法返回true;否則,返回fasle。

java對equals的要求:

  1. 對稱性:如果x.equals(y)返回是"true",那么y.equals(x)也應(yīng)該返回是"true"。
  2. 反射性:x.equals(x)必須返回是"true"。
  3. 類推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也應(yīng)該返回是"true"。
  4. 一致性:如果x.equals(y)返回是"true",只要x和y內(nèi)容一直不變,不管你重復(fù)x.equals(y)多少次,返回都是"true"。
  5. 非空性,x.equals(null),永遠(yuǎn)返回是"false";x.equals(和x不同類型的對象)永遠(yuǎn)返回是"false"。

二、hashcode()作用

hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)哈希碼的作用是確定該對象在哈希表中的索引位置。

hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode() 函數(shù)。

雖然,每個(gè)Java類都包含hashCode() 函數(shù)。但是,僅僅當(dāng)創(chuàng)建并某個(gè)“類的散列表”(關(guān)于“散列表”見下面說明)時(shí),該類的hashCode() 才有用(作用是:確定該類的每一個(gè)對象在散列表中的位置;其它情況下(例如,創(chuàng)建類的單個(gè)對象,或者創(chuàng)建類的對象數(shù)組等等),類的hashCode() 沒有作用。
上面的散列表,指的是:Java集合中本質(zhì)是散列表的類,如HashMap,Hashtable,HashSet。
也就是說:hashCode() 在散列表中才有用,在其它情況下沒用。在散列表中hashCode() 的作用是獲取對象的散列碼,進(jìn)而確定該對象在散列表中的位置。

三、equals和hashcode的關(guān)系

3.1不會創(chuàng)建“類對應(yīng)的散列表”

這種情況下兩者沒有任何關(guān)系。即兩個(gè)對象equals時(shí),hashcode可以不一樣。

3.2 會創(chuàng)建“類對應(yīng)的散列表”

在這種情況下,該類的“hashCode() 和 equals() ”是有關(guān)系的:
1)、如果兩個(gè)對象相等,那么它們的hashCode()值一定相同。
這里的相等是指,通過equals()比較兩個(gè)對象時(shí)返回true。
2)、如果兩個(gè)對象hashCode()相等,它們并不一定相等。

在這種情況下。若要判斷兩個(gè)對象是否相等,除了要覆蓋equals()之外,也要覆蓋hashCode()函數(shù)。否則,equals()無效。例如:兩個(gè)對象equals相等,但是hashcode不等,則HashSet會把這兩個(gè)對象當(dāng)成兩個(gè)不同的對象處理。

參考資料: https://www.cnblogs.com/skywang12345/p/3324958.html

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

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