天天看點

hashCode()和equals()

hashCode()和equals()是什麼?

hashCode()方法和equals()方法的作用其實是一樣,在java裡都是用來對比兩個對象是否相等一緻。

hashCode()和equals()的差別

我們從兩個角度介紹他們的差別:1. 性能,2. 可靠性,他們之間的主要差別也基本展現在這裡。

  1. equals()既然已經能實作對比的功能了,為什麼還要hashCode()呢?

  因為重寫的equals()裡一般比較的,比較全面和比較複雜,這樣效率就比較低,而利用hashCode()進行對比,則隻要生成一個hash值進行比較就可以了,效率很高。

  2. hashCode()既然效率這麼高,為什麼還要equals()呢?

  因為hashCode()并不是完全可靠,有時候不同的對象也們生成的hashCode也會一樣(成生hash值的公式可能存在的問題),是以hashCode()隻能說是大部分時候可靠,并不是絕對可靠,是以我們可以得出:

  • equals()相等的兩個對象他們的hashCode()肯定相等,也就是用equals()對比是絕對可靠的。
  • hashCode()相等的兩個對象他們的equals()不一定相等的,也就是hashCode()不是絕對可靠的。

hashCode()和equals使用的注意事項

  1. 對于需要大量并且快速的對比的話,如果都用equals()去做顯然效率太低,是以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個對象肯定不相等(也就是不必再用equals()去再對比了),如果hashCode()相同,此時再對比他們的equals(),如果equals()也相同,則表示這兩個對象是真的相同了,這樣既能大大提高了效率,也保證了對比的絕對正确性。
  2. 這種大量的并且快速的對象對比一般使用的hash容器中,比如HashSet, HashMap等等,比如HashSet裡要求對象不能重複,則他内部必然要對添加進去的每個對象進行對比,而他的對比規則就是像上面所說的那樣,先hashCode(),如果hashCode()相同,再用equals()驗證,如果hashCode()都不同,則肯定不同,這樣對比的效率就很高了。
  3. 然而hashCode()和equals()一樣都是基本類Object裡的方法,而和equals()一樣,Object裡hashCode()裡面隻是傳回目前對象的位址,如果是這樣的話,那麼我們相同的一個類,new兩個對象,由于他們在記憶體裡的位址不同,則他們的hashCode()不同,是以這顯然不是我們想要的,是以我們必須重寫我們類的hashCode()方法,即一個類,在hashCode()裡面傳回唯一的一個hash值,如果下面:
class Person{
   int num;
   String name;

   public int hashCode(){
       return num * name.hashCode() 
   }    
}      

   由于辨別這個類的是他的内部的變量num和name,是以我們就根據他們傳回一個hash值,作為這個類的唯一hash值。

   是以如果我們的對象要想放進hashSet,并且發揮hashSet的特性(即不包含一樣的對象),則我們就要重寫我們類的hashCode()和equals()方法了。像String, Integer等這種内部都已經重寫的這兩個方法。

   當然如果我們隻是平時想對比兩個對象是否一緻,則隻重寫一個equals(),然後利用equals()去對比也行的。