java中對equals hashcode的理解

若是要比較實際內存中的內容,那就要用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進行重寫。

相關文章
相關標籤/搜索