說說JAVA當中的equals

equals這個屬於Object類的方法,幾乎每天都在用,可是看著它,卻是既熟悉,又陌生。

先來看看Object中的equals中寫了什麼:

說說JAVA當中的equals

恩...似乎沒有什麼用,只是把當前對象的引用與傳入的obj進行對比,於是,就會出現這麼樣的一個情況:

說說JAVA當中的equals

結果為false,就是因為s1與s2是不同的兩個對象。

好,那麼接下來來看看String是怎麼重寫equals方法的:

說說JAVA當中的equals

代碼一大堆,但還是很好理解的,首先判斷引用是否相同,其次判斷是否屬於String類,最後再判斷字符序列。

所以,當需要比較兩個對象的時候,需要重寫equals方法。

那麼重寫equals時,一定得重寫hashCode方法?

那麼hashCode又是什麼?能吃嗎?

hash,翻譯過來又稱哈希、散列,那麼學過數據結構的都知道hash table是什麼東西。

這裡不深入討論,回到equals,如果重寫equals的同時不重寫hashCode的時候,你的代碼可能會出現一些莫名其妙的BUG。

來看一個例子:

假設有這麼樣的一個類:

說說JAVA當中的equals

這個Person類重寫了equals方法,使用判斷名字來判斷兩個對象是否相等。

我們使用一個哈希表來儲存Person與年齡的映射關係:

說說JAVA當中的equals

向map當中放入兩個人:

說說JAVA當中的equals

下面一段代碼的預期值為25:

說說JAVA當中的equals

但是結果卻為null,為什麼?

原因就是在HashMap當中判斷兩個對象相等,是通過hashCode進行的,這是一個需要注意的點。


分享到:


相關文章: