hashcode()和equals()的是是非非

    咱們在不少博客的文章當中,咱們都看到這樣一句話:在重寫equals方法的同時必定要重寫hashCode方法。這是爲何?不少人會說,個人業務代碼,只用equals比較比較兩個對象是否相等不就能夠了,爲何要重寫hashcode?spa

    其實上面說的話不徹底是錯的,若是說你的對象在業務裏永遠不會放入到hash容器當中,徹底不用考慮重寫hashcode方法的問題,可是你的對象若是要放到HashMap這樣的以hash code爲基礎的容器中時,就要考慮重寫hashcode方法。code

    再準確一點的說,若是你的對象在HashMap、HashTable等中要做爲key存放的時候,還有對象放到HashSet中時,就必定要重寫equals和hashcode。爲何?咱們來看一下HashSet的add方法的實現吧。對象

    HashSet的add方法調用了HashMap的put方法,由於HashSet的底層本質,仍是一個Map,只是value是一個固定的Object對象。博客

    HashMap中,e.hash其實就是key的hash值。HashMap判斷key值是否相同的步驟是:hash

  1. 判斷key的hash值是否相等,這個判斷是使用的HashMap中的hash方法,該方法的實現中,若是對象不是String,會直接調用該對象的hashCode方法
  2. 同時判斷key的地址是否相等或者equals相等。

    綜合上面的兩個條件,咱們常常有這麼一個場景。有兩個Personal對象,要放在HashSet中,若是idCard相等,就是同一我的,存放一個對象。這時咱們就不能只簡單的重寫equals方法了,由於第一步是調用hashCode方法,兩個對象的hashCode是不相等的,第一個判斷條件已是false,就不會再繼續使用條件2的equals進行判斷,Set中會存放一個新對象。因此,這時咱們重寫equals方法的同時,就要重寫hashCode,使第一個判斷條件永遠爲true,再使用equals進行idCard的比較。容器

相關文章
相關標籤/搜索