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