为什么在定义hashcode时要使用31这个数呢?
来源:互联网 发布:主流的协同推荐算法 编辑:程序博客网 时间:2024/06/12 05:45
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,相乘造成数据溢出的概率较小。
0 0
- 为什么在定义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;}这个选择器?
- 为什么要漂在北京呢?
- 堆排序中建堆时间复杂度
- 打印一个数组中的数字,2个线程,一个打印奇数,一个打印偶数,交叉打印结果。
- 星型模型 和 雪花型模型
- synchronized修饰函数和封装变量的对象两处需要注意的地方
- android中对小数精度的处理
- 为什么在定义hashcode时要使用31这个数呢?
- Java Swing界面编程(19)---密码输入组件:JPasswordField
- Linux 自定义service
- 2014-5-29任务完成情况
- 两个Activity的传递参数与回传参数
- SQL语言基础练习---数据库server 2008(五) 进阶训练
- Eddy's picture
- 只有mdf文件和ldf文件,怎么恢复数据库。
- Python Checkio