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这个数呢相关推荐

  1. 科普:String hashCode 方法为什么选择数字31作为乘子

    1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主 ...

  2. 为什么String中的Java hashCode()使用31作为乘数?

    本文翻译自:Why does Java's hashCode() in String use 31 as a multiplier? Per the Java documentation, the h ...

  3. 定义变量时一定要初始化

    最近遇到一个问题,在debug模式下怎么运行结果都是正确的,而release时会出现一些诡异的问题,但是问题又诡异的很,比如我printf几句无关痛痒的log信息,可能现象又对了. 只好在汇编模式下一 ...

  4. String hashCode 方法为什么选择数字31作为乘子

    1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主 ...

  5. 科普:String hashCode 方法为什么选择数字 31 作为乘子

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 作者:田小波 来源:https://www. ...

  6. 科普:为什么 String hashCode 方法选择数字31作为乘子

    作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...

  7. 定义指令时“控制器”,“链接”和“编译”函数之间的区别

    本文翻译自:Difference between the 'controller', 'link' and 'compile' functions when defining a directive ...

  8. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )

    文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...

  9. 在定义常量时,为什么推荐使用const,而不是#define?

    在定义常量时,为什么推荐使用const,而不是#define? const修饰词可以将一个变量修饰为"只读",这个就能称为常量么?姑且认为可以.const是只读的意思,它限定一个变 ...

最新文章

  1. 大地形实时渲染资源网收集
  2. C/S和B/S两种模式
  3. [学习笔记] 初次见面,请多关照 (公式推导+题集)——杜教筛
  4. ajax 直接向后台发送请求,通过ajax异步向后端发送请求,响应请求向前端传送json格式数据的实现思路...
  5. Chapter eight Data Structure(数据结构)
  6. poj1036-dp
  7. 红帽子linux拨号上网,centos6.5宽带拨号上网的方法
  8. 一种去除U盘写保护的可行方法(dd 命令解决)
  9. ashampoo(阿香婆) movie studio视频剪辑笔记
  10. 结构化设计(实验二)
  11. 计算机毕业设计Java大学生第二课堂(源码+系统+mysql数据库+lw文档)
  12. Spring源码学习(十八)---基于注解配置Aop的aspectj-autoproxy解析
  13. html数据的格式是什么格式的文件,.html是什么格式的文件,html文件怎么打开
  14. 机械振动信号13个频域指标
  15. uni-app 即时聊天:朋友圈
  16. 【学习分享】创龙TI KeyStone C66x开发例程使用手册
  17. 对现在糟糕的自己剖析
  18. 夜来风雨声,“网络”知多少?
  19. 30.set-UID set-gid stic_bit
  20. 路由器、交换机、集线器工作在哪一层

热门文章

  1. json.dumps直接保存中文而非字符集的方法
  2. 一种比sys.path更好的获得当前脚本路径的方法
  3. js解析二维码_最新最全阿里巴巴,今日头条,腾讯Flutter面试真题全解析(狂虐不止)...
  4. linux文件系统挂载磁盘,linux – 无法挂载磁盘(VFS:找不到ext4文件系统)
  5. 笔记本电脑linux系统下载,给笔记本电脑装Linux系统
  6. 【部署】Nginx长连接配置
  7. Java基础学习巩固3--重载和重写分析及区别
  8. 笔记-项目沟通管理-高效的会议方案
  9. 配置Linux的时钟同步
  10. Fabricjs在Canvas上使用路径Path绘制不规则图形