String 的hashCode原始碼實現原理
阿新 • • 發佈:2019-02-16
原始碼如下:
public int hashCode() {
int h = hash;if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
hash的定義:
/** Cache the hash code for the string */
private int hash; // Default to 0
/** The value is used for character storage. */
private final char value[];
從上面的方法中可以看出hashCode的實現方法是:定義一個整形變數h,h的取值跟value字元陣列的值有關,hashCode取值:((31*h+ASCII碼字元)*31+第二個字元的ASCII碼字元)*31+第三個字元的ASCII碼字元
對於程式出現這個計算方法,我是有疑問的,31是個什麼鬼,為什麼是31?還有就是這個計算方式真的能確保不同字元的hashCode不同嗎?
如果跟我一樣有這些疑問,可以參考:http://blog.csdn.net/steveguoshao/article/details/12576849這篇文章,方正我看了是半信半疑的。半信是這篇文章告訴了我31在這裡的計算方式,半疑就是我也不確定為什麼事31,還有就是這條計算結果真的能保證唯一嗎?
如果有不同理解的,歡迎拍磚交流