關於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集合裡面。