2016.7.28
==與equals()
當比較的類型是基礎數據類型時,只能用==,比較的就是他們的值。
當比較的類型是引用數據類型時,==和未重寫的equals()完全一樣,比較對象的地址,即它們是不是同一個對象。(未重寫的equals()指Object類中的equals方法)
但是,
equals()方法是可以被覆寫的,因為被覆寫所以例如String類型用equals()比較時,比較的也是內容是否相同,而不是是否是同一個對象。
(其實我感覺==可能也能重寫,只是==應用的范圍比equals()大的多,重寫的話嚴重影響其他地方==的使用)
hashCode()和equals()
它們在Collection類,即集合中用的較多。
雖然所有實例類都繼承了Object類,都有了hashCode()和equals()方法,但有時候并不能滿足我們的需求,這時候我們就需要去重寫它們。
注意重寫了equals()就一定要重寫hashCode(),因為判斷時一定是先判斷hashCode(),若hashCode()相同再判斷equals()(下面會再詳細說明)。重寫時要保持它們的邏輯一致。
為什么判斷了hashCode()還要再判斷equals()呢?
hashCode()得到的可以說是一個實例對象的唯一標識符,但是,這個標識符是可能存在沖突的,即可能會存在兩個相同類的不同實例對象,但它們hashCode()的值相同(這個可能性很小,但存在)。
這時候我們就需要equals()來進行最終的判斷,判斷兩個對象的屬性是否相同(可以自己定義條件)。
那既然有了equals()來進行精準的判斷了,為什么還要hashCode()呢?
因為equals()的判斷雖然精準,但若是你已經有1000個數據了,這時要存入一個新數據,那就需要進行1000次equals(),效率低下。
而用hashCode()就可以一下定位到它應該放置的物理位置上,如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了, 就調用equals()方法再進行比較,相同的話就不存了,不相同就散列其它的地址。這樣一來效率大大的提升了。