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() 的關係:
* 此外,在這種情況下。若要判斷兩個對象是否相等,除了要使用equals()之外,也要使用hashCode()函數。否則,equals()無效。
例如,創建Person類的HashSet集合,必須同時覆蓋Person類的equals() 和 hashCode()方法。