1 euqals()方法
我們以Person類為例:public boolean equals(Object o)
l 如果當前對象與o指向同一實例,那麼直接返回true
if(this == o) return true;
l 如果o不是Person類型,那麼直接返回false
boolean b = o instanceof Person;
if(!b) return false;
l 把o向下轉型為Person類型
Person p = (Person)p;
l 如果當前對象的name與p對象的name不相等,那麼返回false
if(!name.equals(p.name)) return false;
l 如果當前對象的age與p對象的age不相等,那麼返回false
if(!age == p.age) return false;
l 如果當前對象的sex與p對象的sex不相等,那麼返回false
if(!sex.equals(p.sex)) return false;
l 執行到這裡,可以肯定兩個元素是相等的了,返回true
return true
publicbooleanequals(Object o) {
if(this== o) {
returntrue;
}
booleanb = o instanceof Person;
if(!b) {
returnfalse;
}
Person p = (Person)o;
if(!name.equals(p.name)) {
returnfalse;
}
if(age != p.age) {
returnfalse;
}
if(!sex.equals(p.sex)) {
returnfalse;
}
returntrue;
}
2 hashCode()方法
我們以Person類為例:int hashCode()
l 定義int h = 0,最終返回h;
l 計算所有屬性的哈希值;
l 計算age:數值類型的屬性本身作為值:
h += this.age;
l 計算name:引用類型的屬性調用其hashCode()方法:
h += name.hashCode();
l 計算sex:引用類型的屬性調用其hashCode()方法:
h += sex.hashCode();
l 最後返回h
對象的hashCode()都在100之內,這對計算桶的分配會過於其中。例如有一萬個桶,而元素都放到了0~10之間的桶中,其它桶中沒有元素,這就不好了!所以需要修改上面的hashCode()方法,放大多個對象哈希碼之間的間隔。
int h = 1;//如果為0,那麼乘以基數也是枉然!
int prime = 31;//基數
h += prime * h + age;
h += prime * h + name.hashCode();
h += prime * h + sex.hashCode();
return h;
publicinthashCode() {
inth = 1;
intprime = 31;
h += prime * h + age;
h += prime * h + name.hashCode();
h += prime * h + sex.hashCode();
returnh;
}