关于String类中的hashcode的相关整理

博客探讨了Java中String类的哈希乘数选择31的原因,强调31是奇素数,能保证哈希分布均匀且计算快速。同时解释了Hashtable中索引位置计算采用0X7FFFFFFF,以确保负数哈希码转换为有效的正整数索引。文章引用了相关资源深入解析这一主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么JavaString哈希乘数选择31?

在这里插入图片描述

  • 31是奇素数(可以充分利用原始数据包含的信息)
  • 哈希分布比较均匀。偶数的冲突率很高,只有少数例外。小乘数(1-20)的冲突率也很高
  • 哈希计算很快。选用31是JVM的一种优化。位移和减法操作比乘法操作快速 31*hash=(hash<<5)-hash;
  • 31和33的计算速度和哈希分布基本一致,整体表现好(大于31,33的奇数虽然效果也不错,但是31和33的移位是最少的,理论上是最快的)

hashtable中索引的位置计算为什么是0X7FFFFFFF

  返回x在hashtable中的索引      
  int index =  (x.hashCode() & 0x7fffffff )%table.length;

0x7fffffff起到了符号屏蔽的作用,因为hashcode有可能为一个负数,与运算之后可以确保得到的index是一个整数,从而通过index索引号获得数据。(hashcode可以直接定位到散列表中位置)

参考:

为什么Java String哈希乘数为31?:https://blog.youkuaiyun.com/zhanjia/article/details/84923530
经典Times33哈希算法:https://mp.weixin.qq.com/s/5DldaWJ8D1WMtUirfdOt6Q
Java提高篇之hashCode(里面讲了很多关于hashmap,hashtable,hashcode的东西):http://www.importnew.com/20381.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值