String.hashCode 哈希值出现重复?

String.hashCode重复

在我学习hash的时候,没有按照教程里面的字符串的值去获取了一个hashcode,然后让这个小白的我惊讶了,这个竟然和教程里面的那个不一样, 对此,我对于这个问题进行了“研究” ,在这里先写点我已经知道的,后续继续学习

  1. 通过查阅资料,得到了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
  1. 又找到两个例子
"柳柴""柴柕"  hashCode=851553
"志捘""崇몈"  hashCode=786017
  1. 知识点
    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的
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

star__king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值