天天看點

哈希碼的計算

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 提高運算效率