为什么在定义hashcode时要使用31这个数呢
public int hashCode() {
int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
该函数是我看的函数接口源码,为什么要使用31这个数呢?
其实上面的实现也可以总结成数数里面下面这样的公式:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
原因如下:
A.31是一个素数,素数作用就是如果我用一个数字来乘以这个素数,那么最终的出来的结果只能被素数本身和被乘数还有1来整除!。(减少冲突)
B.31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有做相关优化.(提高算法效率)
C.选择系数的时候要选择尽量大的系数。因为如果计算出来的hash地址越大,所谓的“冲突”就越少,查找起来效率也会提高。(减少冲突)
D.并且31只占用5bits,相乘造成数据溢出的概率较小。
转载于:https://blog.51cto.com/7835295/1619405
为什么在定义hashcode时要使用31这个数呢相关推荐
- 科普:String hashCode 方法为什么选择数字31作为乘子
1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主 ...
- 为什么String中的Java hashCode()使用31作为乘数?
本文翻译自:Why does Java's hashCode() in String use 31 as a multiplier? Per the Java documentation, the h ...
- 定义变量时一定要初始化
最近遇到一个问题,在debug模式下怎么运行结果都是正确的,而release时会出现一些诡异的问题,但是问题又诡异的很,比如我printf几句无关痛痒的log信息,可能现象又对了. 只好在汇编模式下一 ...
- String hashCode 方法为什么选择数字31作为乘子
1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主 ...
- 科普:String hashCode 方法为什么选择数字 31 作为乘子
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 作者:田小波 来源:https://www. ...
- 科普:为什么 String hashCode 方法选择数字31作为乘子
作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...
- 定义指令时“控制器”,“链接”和“编译”函数之间的区别
本文翻译自:Difference between the 'controller', 'link' and 'compile' functions when defining a directive ...
- 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...
- 在定义常量时,为什么推荐使用const,而不是#define?
在定义常量时,为什么推荐使用const,而不是#define? const修饰词可以将一个变量修饰为"只读",这个就能称为常量么?姑且认为可以.const是只读的意思,它限定一个变 ...
最新文章
- 大地形实时渲染资源网收集
- C/S和B/S两种模式
- [学习笔记] 初次见面,请多关照 (公式推导+题集)——杜教筛
- ajax 直接向后台发送请求,通过ajax异步向后端发送请求,响应请求向前端传送json格式数据的实现思路...
- Chapter eight Data Structure(数据结构)
- poj1036-dp
- 红帽子linux拨号上网,centos6.5宽带拨号上网的方法
- 一种去除U盘写保护的可行方法(dd 命令解决)
- ashampoo(阿香婆) movie studio视频剪辑笔记
- 结构化设计(实验二)
- 计算机毕业设计Java大学生第二课堂(源码+系统+mysql数据库+lw文档)
- Spring源码学习(十八)---基于注解配置Aop的aspectj-autoproxy解析
- html数据的格式是什么格式的文件,.html是什么格式的文件,html文件怎么打开
- 机械振动信号13个频域指标
- uni-app 即时聊天:朋友圈
- 【学习分享】创龙TI KeyStone C66x开发例程使用手册
- 对现在糟糕的自己剖析
- 夜来风雨声,“网络”知多少?
- 30.set-UID set-gid stic_bit
- 路由器、交换机、集线器工作在哪一层
热门文章
- json.dumps直接保存中文而非字符集的方法
- 一种比sys.path更好的获得当前脚本路径的方法
- js解析二维码_最新最全阿里巴巴,今日头条,腾讯Flutter面试真题全解析(狂虐不止)...
- linux文件系统挂载磁盘,linux – 无法挂载磁盘(VFS:找不到ext4文件系统)
- 笔记本电脑linux系统下载,给笔记本电脑装Linux系统
- 【部署】Nginx长连接配置
- Java基础学习巩固3--重载和重写分析及区别
- 笔记-项目沟通管理-高效的会议方案
- 配置Linux的时钟同步
- Fabricjs在Canvas上使用路径Path绘制不规则图形