只要覆蓋equals()方法,就應(yīng)該覆蓋hasCode()方法

字號:

不一定需要覆蓋的.....
    覆蓋hashcode類主要用要set集合里面..
    在set集合中為了確保集合元素的性,集合中沒有重復(fù)的元素,插入的時候會用equals()方法按照內(nèi)存地址來比較對象是否相等,當(dāng)你的equals()方法沒有被覆蓋時,比較得出兩個object地址為true,其哈希碼一定也相同,
    當(dāng)你覆蓋了equals()方法的,可能你比較出來的equals()結(jié)果是true,但兩個object的在內(nèi)存中存放地址不同,哈希碼可能會不同,這就的話hashset這個就無法正常運(yùn)行,所以為了保證HashSet正常工作,這時要同時覆蓋HashCode()方法....  
    Examda提示:在Object類中定義了hashCode()和equals()方法,Object類的equals()方法按照內(nèi)存地址比較對象是否相等,因此如果 object1.equals(object2)為true,表明object1變量和object2變量實(shí)際上引用同一個對象,那么object1和 object2的哈希碼肯定也相同,也就是說object1.hashCode()==object2.hashCode()
    如果用戶定義的類覆蓋了Object類的equals()方法,但是沒有覆蓋Object類的hashCode()方法,就會導(dǎo)致當(dāng) object1.equals(object2)為true 時,而 object1 和 object2的哈希碼不一定一樣。
    所以如果覆蓋了equals()方法,也應(yīng)該覆蓋hashCode()方法,并且保證2個相等的object對象的哈希碼也一樣
    代碼:
    ObjectChild覆蓋Object類的equals()方法
    public boolean equals(Object o){
    if(this==0) return true;
    if(! (o instanceof ObjectChild)) return false;
    final ObjectChild other = (ObjectChild) o ;
    if(this.name.equals(other.getName()) && this.age == other.getAge())
    //這里假定的 ObjectChild 是一個JavaBean 對象,含有 name 和 age 2個屬性,如果name和age相同,則看為同一個對象
    return true;
    else
    return false;
    }
    ObjectChild覆蓋Object類的hashCode()方法
    //Examda提示:返回自定義方法計(jì)算出的hashCode值,使得擁有相同屬性的對象擁有相同的hashCode;
    public int hashCode(){
    int result;
    result = (name==null?0:name.hashCode());
    result = 29*result + (age==null?0:age.hashCode());
    return result;
    }