关于Java中String类的hashCode方法
来源:互联网 发布:淘宝查物流软件 编辑:程序博客网 时间:2024/04/23 18:33
首先来看一下String中hashCode方法的实现源码
1 public int hashCode() { 2 int h = hash; 3 if (h == 0 && value.length > 0) { 4 char val[] = value; 5 6 for (int i = 0; i < value.length; i++) { 7 h = 31 * h + val[i]; 8 } 9 hash = h;10 }11 return h;12 }
在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方法判断字符串相等或者字符串回文,都存在反例。
本文转自:http://www.cnblogs.com/micrari/p/5626202.html
0 0
- 关于Java中String类的hashCode方法
- 关于Java中String类的hashCode方法
- JAVA中String类的hashCode方法
- Java中String类的hashCode方法
- java中String类的hashCode方法实现
- javascript 实现 java 中String的hashcode方法
- Java编程:String 类中 hashCode() 方法详解
- 关于java的hashCode方法
- 关于java的hashCode方法
- 关于java的hashCode方法
- 关于java的hashCode方法
- 关于java的hashCode方法
- 关于java的hashCode方法
- 关于java的hashCode方法
- 关于java的hashCode方法
- 关于java的hashCode方法 .
- 关于Java的Hashcode方法
- 关于java的hashCode方法
- Linux学习--gdb调试
- 链表------------------单向链表的建立跟遍历
- javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
- Codeforces Round #254 (Div. 2)B
- 整数划分总结
- 关于Java中String类的hashCode方法
- BZOJ 1032: [JSOI2007]祖码Zuma 区间DP
- 优先队列priority_queue 用法详解
- LeetCode485. Max Consecutive Ones有你真好
- 写rails代码时需要知道的几个技巧
- 2016年总结篇(上)
- 欢迎使用CSDN-markdown编辑器
- [OpenGL]从零开始写一个Android平台下的全景视频播放器——4.1 传感器类型以及数据收集方法
- C#解决运行窗口闪退