美文网首页
为什么大部分的hascodefang使用31

为什么大部分的hascodefang使用31

作者: 程序员的交流电 | 来源:发表于2019-11-28 18:23 被阅读0次

周启著名的《Effective java》这本书里面,对为什么使用31进行hascode进行了说明:

之所以使用31,是因为他是一个奇素数。如果乘数是偶数的话,采用乘法,信息就会丢失,等价于与2相乘的左位移。31有一个很好的性能,就是可以使用位移和减法来替代乘法,可以得到更好的性能:31*i=(i<<5)-i,现代的vm可以自动的完成这种优化,这个公式可以很简单的推导出来的。

素数有一个很好的优点,就是使用一个数字来乘以这个素数,得出来的数只能被1,素数和这个数,整除,这个就是3n只能被3和n和1整除。这个优点可以用在hashmap里面的用来解决key的碰撞。
所以综上;
1,素数,相比较于偶数更具有优点
2,素数与其他数相乘,3n结果只能被3和n和1整除,可以减少hash冲突,更好的分配hash地址。
3, 31拥有性能的优势,相比较于乘,现在vm可以做到31*i=(i<<5)-i的优化,提高性能。
4,31只占用5bits!在java乘法中如果数字相乘过大会导致溢出的问题,从而导致数据的丢失,而31则是素数(质数)而且不是很长的数字,最终它被选择为相乘的系数的原因。
参考:https://blog.csdn.net/mxw2552261/article/details/91349677

相关文章

  • 为什么大部分的hascodefang使用31

    周启著名的《Effective java》这本书里面,对为什么使用31进行hascode进行了说明: 之所以使用3...

  • Android开发中的的MVP模式

    MVP,全称 Model-View-Presenter1,为什么使用MVP? 大部分的安卓应用只使用View-Mo...

  • Interger的最大值问题

    Integer.MAX_VALUE =2147483647 此值是2的31次方-1 为什么使用这个值 思路如下: ...

  • Git的使用

    为什么使用Git 在使用Git之前,大部分人都在使用SVN,SVN必须链接到中央服务器,工作的时候,必须联网,然后...

  • String HashCode

    数据结构,HashCode为什么使用31作为乘数 建议配合小傅哥的面经手册使用!!!从今天开始我是小傅哥的布道师 ...

  • gulp 使用说明

    说明 这个是使用laravel进行后台开发的,所以大部分的东西是适应laravel的工作流的,至于为什么没有使用l...

  • 在Intellij IDEA中使用lombok插件进行综合项目开

    为什么要使用lombok? 应用场景:在JavaEE项目中经常使用bean,entity等类,绝大部分数据类中都需...

  • 七牛云CDN加速WordPress网站 - CDN介绍

    本文章以比较通俗的语言讲述下 CDN 是什么,CDN 为什么能加速网站访问,为什么大部分网站都要使用 CDN,涉及...

  • 时间管理100讲【30-50】

    【31】【拖延】拖延症根治的三个方法 为什么说拖延症是特别难根治的呢,因为我们大部分是受我们习惯所控制的,一个...

  • unity使用lua

    为什么是使用Lua 脚本语言的优势: 大部分脚本语言相对C++这种高级编辑语言来说,都语法简单,通俗易懂 使用脚本...

网友评论

      本文标题:为什么大部分的hascodefang使用31

      本文链接:https://www.haomeiwen.com/subject/yazbwctx.html