String.hashCode重复
在我学习hash的时候,没有按照教程里面的字符串的值去获取了一个hashcode,然后让这个小白的我惊讶了,这个竟然和教程里面的那个不一样, 对此,我对于这个问题进行了“
研究”,在这里先写点我已经知道的,后续继续学习
- 通过查阅资料,得到了String.hashCode的算法,如下:
str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + ... + str.charAt(n-1)
据说这个31就是一个优化后的数字,就是为了避免英文中的重复哈希来的,但是碰上字母大小写或是一些特殊字符,再或者是中文字符,它就不灵了,我这里就是这个情况,还让我纳闷了好久
部分代码:
System.out.println("重地".hashCode());//1179395
System.out.println("通话".hashCode());//1179395
默认情况下(使用Object类中的方法),不同对象的hash值是不相同的,所以我就疑问了?????
可以看到两个一样,但是我输入的是“童话”,结果如下:
System.out.println("重地".hashCode());//1179395
System.out.println("通话".hashCode());//1179395
System.out.println("童话".hashCode());//1011096
- 又找到两个例子
"柳柴"与"柴柕" hashCode=851553
"志捘"与"崇몈" hashCode=786017
- 知识点
java中所有的对象都有一个父类Object,而Object类都有hashCode方法,也就是说java中所有的类均会有hashCode方法;
- 通过查找技术文档发现,String中的重写了hashCode方法,但是String类的hashCode算法是固定的
- str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + … + str.charAt(n-1)
- 根据算法就可以看到是可能会存在相同hashCode的