1. 程式人生 > >關於Object類的equals方法和hashCode方法

關於Object類的equals方法和hashCode方法

關於Object類的equals的特點,對於非空引用:

1.自反性:x.equals(x) return true ;

2.對稱性:x.equals(y)為true,那麼y.equals(x)也為true;

3.傳遞性:x.equals(y)為true,y.equals(z)為true,那麼x.equals(z)也為true;

4.一致性:x.equals(y)的第一次呼叫為true,那麼x.equals(y)的第二次,第三次,。。。,第n次呼叫也為true,前提條件是在比較之間沒有修改x,也沒有修改y。

5.x.equals(null)返回false。

當override equals方法時,同時需要重寫hashCode方法,以保證相同物件的hashCode值相同。

關於Object類的hashCode方法的特點:

1.在java應用的一次執行過程當中,對於同一個物件的hashCode方法的多次呼叫,應該返回同樣的值。(前提是該物件的資訊沒有發生改變);

2.對於兩個物件來說,如果使用equals方法比較返回true,那麼這兩個物件的hashCode值一定是相同的;

3.對於兩個物件來說,如果使用equals方法比較返回false,那麼這兩個物件的hashCode值不要求一定不同,也就是說可以相同,也可以不同。但是,如果不同,則可以提高應用的效能。

4.對於Object類來說,不同的Object物件的hashCode值是不同的(Object類的hashCode值表示的是物件的地址,其他類如果重寫了hashCode()方法,那麼hashCode值就不一定表示的是地址了)。

如果我們重寫equals方法,那麼有也要重寫hashCode方法,反之依然。

集合增加時的原理:

    當使用HashSet時,hashCode()方法就會被呼叫,判斷已經儲存在集合中的物件的hashCode值是否與增加的物件的hashCode值一致;如果不一致,直接加進去;如果一致,再進行equals方法的比較,equals方法如果返回true,表示物件已經加進去了,就不會再增加新的物件,否則加進去。

例如:

 

結果只會增加一個。因為String類重寫了equals和hashCode方法,hashCode方法只是將字串的內容通過一定的轉換,轉換成一個整數值。所以,String類的equals方法,只要兩個字串內容相同,則equals返回true。

另外一個例子:

首先,定義一個People類,未重寫equals方法和hashCode方法。

 

執行下面程式碼:

 

執行結果:

P1和P2都會加到set集合裡面去,因為People類繼承自Object類,Object類的hashCode()方法返回的值是地址的一種表現形式,因為P1和P2地址是不相同的,所以hashCode值也是不相同的,所以都會被加入到set集合裡面。