equals這個屬於Object類的方法,幾乎每天都在用,可是看著它,卻是既熟悉,又陌生。
先來看看Object中的equals中寫了什麼:
![說說JAVA當中的equals](http://p2.ttnews.xyz/loading.gif)
恩...似乎沒有什麼用,只是把當前對象的引用與傳入的obj進行對比,於是,就會出現這麼樣的一個情況:
![說說JAVA當中的equals](http://p2.ttnews.xyz/loading.gif)
結果為false,就是因為s1與s2是不同的兩個對象。
好,那麼接下來來看看String是怎麼重寫equals方法的:
代碼一大堆,但還是很好理解的,首先判斷引用是否相同,其次判斷是否屬於String類,最後再判斷字符序列。
所以,當需要比較兩個對象的時候,需要重寫equals方法。
那麼重寫equals時,一定得重寫hashCode方法?
那麼hashCode又是什麼?能吃嗎?
hash,翻譯過來又稱哈希、散列,那麼學過數據結構的都知道hash table是什麼東西。
這裡不深入討論,回到equals,如果重寫equals的同時不重寫hashCode的時候,你的代碼可能會出現一些莫名其妙的BUG。
來看一個例子:
假設有這麼樣的一個類:
這個Person類重寫了equals方法,使用判斷名字來判斷兩個對象是否相等。
我們使用一個哈希表來儲存Person與年齡的映射關係:
向map當中放入兩個人:
下面一段代碼的預期值為25:
但是結果卻為null,為什麼?
原因就是在HashMap當中判斷兩個對象相等,是通過hashCode進行的,這是一個需要注意的點。
閱讀更多 最後一個NPE 的文章