equals、==、hashCode的區別

equals介紹:

equals方法在非空對象引用上實現相等關係

特點:

* 自反性:對於任何非空引用值x,x.equals(x)都返回true

* 對稱性:對於任何非空引用值a、b,當且僅當a.equals(b)返回true時,b.equals(a)返回true

* 傳遞性:對於任何非空引用值x、y、z,當x.equals(y)返回true,並且y.equals(z)返回true時,則x.equals(z)返回true

* 一致性:對於任意非空引用值x、y,多次調用x.equals(y),其結果不變,前提是對象在上equals比較中用到的信息沒有被修改

* 對於任意非空引用值x,x.equals(null)返回false

以上五點是重寫equals方法時必須遵守的準則

equalsd的作用:

用來判斷兩個對象是否相等

equals()定義在JDK的Object.java中,通過判斷兩個對象的地址是否相等來區分它們是否相等

下面根據“類是否覆蓋equals()方法”,將它分爲2類。

(01) 若某個類沒有覆蓋equals()方法,當它的通過equals()比較兩個對象時,實際上是比較兩個對象是不是同一個對象。這時,等價於通過“==”去比較這兩個對象。

(02) 我們可以覆蓋類的equals()方法,來讓equals()通過其它方式比較兩個對象是否相等。通常的做法是:若兩個對象的內容相等,則equals()方法返回true;否則,返回fasle。

由上邊分類引出equals和==的區別

== : 它的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不試同一個對象。

equals() : 它的作用也是判斷兩個對象是否相等。但它一般有兩種使用情況

情況1:

類沒有覆蓋equals()方法。則通過equals()比較該類的兩個對象時,等價於通過“==”比較這兩個對象

情況2:

類覆蓋了equals()方法。一般,我們都覆蓋equals()方法來判斷兩個對象的內容是否相等;若它們的內容相等,則返回true(即,認爲這兩個對象相等)。

hashCode的作用:

hashCode()的作用是獲取哈希碼,也成爲散列碼;它返回一個int整數,這個哈希碼(散列碼)的作用是確定該對象在哈希表中的索引位置

hashCode()定義在JDK的Object.java中,這就意味着java中的任何類都包含hashCode()函數,

雖然,每個Java類都包含hashCode() 函數。但是,僅僅當創建“類的散列表”時,該類的hashCode() 纔有用,作用是:確定該類的每一個對象在散列表中的位置;

其它情況下(例如,創建類的單個對象,或者創建類的對象數組等等)類的hashCode() 沒有作用。

散列表:

java集合中本質是散列表的類如:HashMap,HashTable,HashSet等

也就是說hashCode()在散列表中才有用,在其他情況下沒用,在散列表中hashCode()的作用是獲取對象的散列碼,進而確定該對象在散列表中的位置


hashCode() 和 equals() 的關係:

1.不會創建該類對應的散列表

是說:我們不會在HashSet,HashTable,HashMap等這些本質爲散列表的數據結構中用到這個類,如:不會創建這個類的HashSet結合
2.會創建該類對應的散列表
   是說:我們會在HashSet,HashTable,HashMap等這些本質爲散列表的數據結構中用到這個類,如:我們會創建這個類的HashSet集合
這種情況下hashCode和equals是有關係的
如果兩個對象相等,那麼它們的hashCode()值一定相同。這裏的相等是指,通過equals()比較兩個對象時返回true。
  * 如果兩個對象hashCode()相等,它們並不一定相等。因爲在散列表中,hashCode()相等,即兩個鍵值對的哈希值相等。
然而哈希值相等,並不一定能得出鍵值對相等。補充說一句:“兩個不同的鍵值對,哈希值相等”,這就是哈希衝突。    

  * 此外,在這種情況下。若要判斷兩個對象是否相等,除了要使用equals()之外,也要使用hashCode()函數。否則,equals()無效。

例如,創建Person類的HashSet集合,必須同時覆蓋Person類的equals() 和 hashCode()方法。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章