1)自主選擇一個類,說明它hashCode方法的設計理念和代碼核心邏輯
首先說明下hashCode的作用:(提高查詢對象的效率)以java.lang.Object來了解JVM每new一個Object對象,它都會将這個Object丢到一個Hash哈希表中去,這樣的話,
下次做Object的比較或者取這個對象的時候,它會以這個對象的hashcode為key,從Hash表中取這個對象。這樣做的目的是提高取對象的效率。
如果兩個對象的equals方法為true,則hashCode必然相等;反之hashCode相等的兩個對象,equals()不一定相等。
hashcode的設計理念:保證資料hash值均勻的分布到一定的範圍内。要盡可能的減少hash沖突。數值不能太大,否則會溢出
2) 舉例說明
String類中的hashcode()方法:
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
//重點
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
String類覆寫了Object類中的hashCode方法,一個String的對象的hashCode值的計算方法為:s[0]31^(n-1) + s[1]31^(n-2) + ... + s[n-1]。
其中,s[i]表示是第i個字元,n是字元串的長度。這裡是取字元的ASC2碼的值進行計算的。
這裡選擇質數31的原因:1。經研究測試表明:31是一個不大不小的質數 使用它突的機率會小很多 2.31可以被 JVM 優化,31 * i = (i << 5) - i 提高運算效率