- public int hashCode() {
- int h = hash;
- if (h == 0) {
- int off = offset;
- char val[] = value;
- int len = count;
- for (int i = 0; i < len; i++) {
- h = 31*h + val[off++];
- }
- hash = h;
- }
- return h;
- }
实际上是使用霍纳法则计算![h(s)=\sum_{i=0}^{n-1}s[i] \cdot 31^{n-1-i}](http://upload.wikimedia.org/math/8/a/6/8a6ab0ec42fd05a18d986eecc6c651b6.png)
即
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 的值
选择31是因为他为素数,且他等于左移5位-1的值,vm会自动做这种优化
http://book.douban.com/subject/1610337/ lafore的这本书写的很人性化,没有太多公式,适合入门,第11章讲到了这部分
http://en.wikipedia.org/wiki/Java_hashCode()
http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier
http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html

本文深入探讨了Java中String类的hashCode方法的实现原理,通过霍纳法则进行字符串哈希值的计算,并解释了选择31作为乘数的原因。通过引用经典书籍和权威资源,提供了一个全面且易于理解的解释。

1935

被折叠的 条评论
为什么被折叠?



