源代码如下:
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,还有就是这条计算结果真的能保证唯一吗?
如果有不同理解的,欢迎拍砖交流