1. 程式人生 > >String 的hashCode原始碼實現原理

String 的hashCode原始碼實現原理

原始碼如下:

 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,還有就是這條計算結果真的能保證唯一嗎?

如果有不同理解的,歡迎拍磚交流