若是要比較實際內存中的內容,那就要用equals方法,可是!!! java
若是是你本身定義的一個類,比較自定義類用equals和==是同樣的,都是比較句柄地址,由於自定義的類是繼承於object,而object中的equals就是用==來實現的,你能夠看源碼。 測試
那爲何咱們用的String等等類型equals是比較實際內容呢,是由於String等經常使用類已經重寫了object中的equals方法,讓equals來比較實際內容。 this
在通常的應用中你不須要了解hashcode的用法,但當你用到hashmap,hashset等集合類時要注意下hashcode。 code
你 想經過一個object的key來拿hashmap的value,hashmap的工做方法是,經過你傳入的object的hashcode在內存中找地 址,當找到這個地址後再經過equals方法來比較這個地址中的內容是否和你原來放進去的同樣,同樣就取出value。 繼承
因此這裏要匹配2部分,hashcode和equals 遊戲
但 假如說你new一個object做爲key去拿value是永遠得不到結果的,由於每次new一個object,這個object的hashcode是永 遠不一樣的,因此咱們要重寫hashcode,你能夠令你的hashcode是object中的一個恆量,這樣永遠能夠經過你的object的 hashcode來找到key的地址,而後你要重寫你的equals方法,使內存中的內容也相等。。。 內存
下面我測試一個簡單的例子 rem
import java.util.*; public class Elins { public static void main(String[] args){ Collection c =new HashSet(); c.add("Hellow"); c.add(new Name("天空遊戲","www.tkyouxi.com")); System.out.println(c.remove(new Name("天空遊戲","www.tkyouxi.com"))); System.out.println(c); } } class Name{ private String c; private String d; public Name(String a,String b){ this.c=a; this.d=b; } public String toString(){ return c+":"+d; } public boolean equals(Object object){ return true; } // public int hashCode(){ // return c.hashCode(); // } }
當沒有重寫hashCode時的輸出結果: get
false
[天空遊戲:www.tkyouxi.com, Hellow] 源碼
從 結果中能夠看到c.remove(new Name("天空遊戲","www.tkyouxi.com"))的反回結爲fale;這個就是說明了c中的Name對像和要remove時new對像不 equals.如今咱們把30,31,32的註釋去掉再來運行一下。下面是輸出結果:
true [Hellow] 能夠看到c裏的Name對像被remove掉了。因此在當對像用在hashmap,hashset等集合類時要對equals與hashCode進行重寫。