String中hashCode算法
2017-07-06 本文已影响50人
橙小张
说起hashCode是,就先说下HashCode一些关键点:
1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
2、如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。
- 总结一句话就是:hashCode是为了方便查找,hashCode相同,两个对象不一定相等,但是两个对象相等,hashCode一定相同。
通过一段代码来测试下:
image.png
- 17-19行创建了3个字符串对象
- 20-22行输出了对应的hash值,可以看到a和c的hash值是一样的
String的hashCode方法的代码
- hashCode方法的核心代码是1471行,其实现的计算公式为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
,这也是说为什么hashCode相同,对象不一定相等的原因了,不同的字符串是可以通过计算逻辑累加一个相同的hash值的。
- String最终是以char数组存储的
- hashcode实现中在1468行将该String的value赋值给了
char val[]
自己实现的话可以这样
image.png总结:
- 深入学习的String内幕的话可以看下这篇博客:http://www.jianshu.com/p/2f209af80f84
- 学习下算法(巧妙地以一行代码实现复杂的
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
计算)