首先来看一下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;
}

在String中有一个私有实例字段hash表示该串的哈希值,在第一次调用hashCode方法时,字符串的哈希值被计算并且赋值给hash字段。之后再调用hashCode方法便可以直接取hash字段返回。

String类中的hashCode计算方法还是比较简单的,就是一31为权,每一位字符的ASCII只进行计算,用自然溢出来等效取模。

哈希计算公式可以记为s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]。

关于为什么取31为权,可以参考StackOverflow上的这个问题

主要原因是因为31是一个奇素数,所以31*i=32*i-i=(i<<5)-i,这种位移与剪发结合的计算相比一般的运算块很多。

字符串哈希可以做很多事情,通常是类似于字符串判等,判回文之类的。

但是仅仅依赖于哈希值来判断其实是不严谨的,除非能够保证不会有哈希值冲突。通常这一点很难做到。

就拿jdk中String类的哈希方法来举例,字符串“gdejicbegh”与字符串"hgebcijedg"具有相同的hashCode()返回值-801038016,并且他们具有reverse的关系。这个例子说明了用jdk中默认的hashCode方法判断字符串相等或者字符串回文都存在反例。

最新文章

  1. 离线更新VSAN HCL数据库
  2. (转)C# wnform 请求http ( get , post 两种方式 )
  3. 【Java】Socket+多线程实现控制台聊天室
  4. (转)Salesforce的440亿美金并购宣告企业软件市场进入3.0互联网化时代
  5. php显示日期(今天、昨天、本周、上周、本月、上月、)
  6. C++编程规范之17:避免使用“魔数”
  7. CMD下用csc.exe编译.cs 代码
  8. Canvas createRadialGradient API
  9. --css 控制文字多使用省略号
  10. 深度学习(一)cross-entropy softmax overfitting regularization dropout
  11. 五、VueJs 填坑日记之将接口用webpack代理到本地
  12. Yii2.0源码阅读-behavior的实现原理
  13. ios开启双重认证之填坑式教学
  14. 泊爷带你学go -- 反射的经典玩法
  15. ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一)
  16. bzoj4445 小凸想跑步
  17. Bootstrap(11)列表组面板和嵌入组件
  18. [CF1009G]Allowed Letters[贪心+霍尔定理]
  19. django 的用户验证及登录状态保持
  20. C语言——无向带权图邻接矩阵的建立

热门文章

  1. Codeforces Round #279 (Div. 2)B. Queue(构造法,数组下标的巧用)
  2. python_根据&quot;词库&quot;进行“词联想”
  3. python 调试命令
  4. New Year and Counting Cards
  5. an easy problem(贪心)
  6. shell for的用法
  7. demo1 spark streaming 接收 kafka 数据java代码WordCount示例
  8. svn 撤销修改
  9. bytes,packet区别 字节数据包
  10. java 多线程系列基础篇(二)