簡要的談談equals與hashcode

如何判斷java兩個對象相同呢?
首先說說這個問題的由來。我們知道在java中有兩個很重要的數據結構,一個是hashset,另一個是hashmap。hashset要求不能出現相同的對象,hashmap要求不能出現相同的key。所以怎麼判斷兩個對象是否是相同呢?
答案就在equals與hashcode兩個函數中。
首先說明一下JDK對equals(Object obj)和hashcode()這兩個方法的定義和規範:

  • 規範1:若重寫equals(Object obj)方法,有必要重寫hashcode()方法,確保通過equals(Object obj)方法判斷結果爲true的兩個對象具備相等的hashcode()返回值。說得簡單點就是:“如果兩個對象相同,那麼他們的hashcode應該 相等”。

  • 規範2:如果equals(Object obj)返回false,即兩個對象“不相同”,並不要求對這兩個對象調用hashcode()方法得到兩個不相同的數。說的簡單點就是:“如果兩個對象不相同,他們的hashcode可能相同”。

根據這兩個規範,可以得到如下推論:

  1. 如果兩個對象equals,Java運行時環境會認爲他們的hashcode一定相等。
  2. 如果兩個對象不equals,他們的hashcode有可能相等。
  3. 如果兩個對象hashcode相等,他們不一定equals。
  4. 如果兩個對象hashcode不相等,他們一定不equals。

現在我們來看看hashset與hashmap是怎樣來處理的。首先說明一點的是hashset的底層實現是基於hashmap的。所以這裏我們只討論hashmap就好了。
其實,根據推論我們應該也知道,要判斷兩個對象是不是相同,首先要判斷它們的hashcode是否相等,然後再判斷equals的返回值是否爲true。

鳴謝

巴山夜雨
weibo
weixin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章