关于Java中hashCode方法的实现源码
2024-10-20 03:29:24
首先来看一下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方法判断字符串相等或者字符串回文都存在反例。
最新文章
- 离线更新VSAN HCL数据库
- (转)C# wnform 请求http ( get , post 两种方式 )
- 【Java】Socket+多线程实现控制台聊天室
- (转)Salesforce的440亿美金并购宣告企业软件市场进入3.0互联网化时代
- php显示日期(今天、昨天、本周、上周、本月、上月、)
- C++编程规范之17:避免使用“魔数”
- CMD下用csc.exe编译.cs 代码
- Canvas createRadialGradient API
- --css 控制文字多使用省略号
- 深度学习(一)cross-entropy softmax overfitting regularization dropout
- 五、VueJs 填坑日记之将接口用webpack代理到本地
- Yii2.0源码阅读-behavior的实现原理
- ios开启双重认证之填坑式教学
- 泊爷带你学go -- 反射的经典玩法
- ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一)
- bzoj4445 小凸想跑步
- Bootstrap(11)列表组面板和嵌入组件
- [CF1009G]Allowed Letters[贪心+霍尔定理]
- django 的用户验证及登录状态保持
- C语言——无向带权图邻接矩阵的建立
热门文章
- Codeforces Round #279 (Div. 2)B. Queue(构造法,数组下标的巧用)
- python_根据";词库";进行“词联想”
- python 调试命令
- New Year and Counting Cards
- an easy problem(贪心)
- shell for的用法
- demo1 spark streaming 接收 kafka 数据java代码WordCount示例
- svn 撤销修改
- bytes,packet区别 字节数据包
- java 多线程系列基础篇(二)