为什么在定义hashcode时要使用31这个数呢?
来源:互联网 发布:ftp上传工具 for mac 编辑:程序博客网 时间:2024/05/16 15:06
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,相乘造成数据溢出的概率较小。
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数呢?
- 为什么在定义hashcode时要使用31这个数?
- [转载]关于定义hashcode时要使用31这个数的解释
- 为什么宏定义总是要使用do-while语句呢?
- 为什么要引入filebuf这个对象呢?
- 为什么要在定义抽象类时使用abstract关键字
- 为什么要在定义抽象类时使用abstract关键字
- 为什么要在定义抽象类时使用abstract关键字
- 为什么在覆盖equals时一定也要覆盖hashCode
- 为什么写这个博客呢。。。。
- 为什么要使用Kotlin呢
- 为什么要在css文件中定义 ul{margin:0;padding:0;}这个选择器?
- 为什么要漂在北京呢?
- Z-Stack协议分析工具之Packet Sniffer
- java transient
- android listview中的adapter
- worldwind学习笔记-7-找找如何画球的
- 正则表达式的学习——原载于我的百度空间
- 为什么在定义hashcode时要使用31这个数呢?
- 20个有用的java代码片段
- 三维凸包模板
- JAVA_WEB Oracle 10g学习:PL/SQL数据类型
- Linux扫盲篇:CentOS、Ubuntu、Gentoo
- HDU 2650 A math problem (高斯整数环)
- 8月28日CSDN云计算俱乐部“聚焦NOSQL数据库实战”线下沙龙
- 【Cocos2d-X开发学习笔记】开发工具之Tiled地图编辑器的使用
- Visual studio 2010 自用插件备份