为什么在定义hashcode时要使用31这个数呢?
来源:互联网 发布:遥感影像匀光匀色软件 编辑:程序博客网 时间:2024/06/06 00:38
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,相乘造成数据溢出的概率较小。
- 顶
- 2
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;}这个选择器?
- 为什么要漂在北京呢?
- ASUS Z-170A 主板锁定 CPU 频率
- 冒泡排序及其优化
- POJ 3660(floyd)
- Android使用byte数组生成一张灰度图
- androidstudio导入youkuPlayerOpenSDK失败解决
- 为什么在定义hashcode时要使用31这个数呢?
- Linux shell命令
- AndroidHttpCapture 网络诊断工具 是一款针对于移动流量劫持而开发的手机抓包软件
- Phone Number 山东省第一届ACM大学生程序设计竞赛(原题) problem A
- java给定日期区间计算其中的周几有几天
- 预报在线:发送短信中,对用户登录的判断和区分一般信息快报和重大信息快报,以选取不同的sql获取不同的用户;
- TextView 显示 html
- git reset revert 回退回滚取消提交返回上一版本
- OpenSSL 使用 base64 编码/解码