为什么HashTable的初始化因子是11,HashMap却是16
关于HashTable和HashMap的不同点这里就不再说明,网上很多;
今天突然对这个初始化因子不通的问题有了兴趣,以前只知道不一样,从没想过为什么不一样,然后查了半天,感觉相关文章说的很少,想自己来记录一下
关于HashTable和HashMap,最重要的不过是hash了,而hash的目的就是为了尽可能的减少寻址冲突,下面边看源码变分析(1.8)
1.HashTable
使用外部对象key的hashCode()方法,经过和数组大小取模获取下标。
那么这里为什么用11,而不是用16呢(HashMap的是16)?
网上有不少说的论证是如下图(【集合我能讲两小时028】为什么hashtable的扩容方式选择为2n+1?_檀越剑指大厂的博客-CSDN博客_hashtable扩容为什么是2n+1为什么hashtable的扩容方式选择为2n+1?为了均匀分布,降低冲突率。首先,Hashtable的初始容量为11。Index的计算方式为: int index = (hash & 0x7FFFFFFF) % tab.length;常用的hash函数是选一个数m取模(余数),这个数在课本中推荐m是素数,但是经常见到选择m=2n,因为对2n求余数更快,并认为在key分布均匀的情况下,key%m也是在[0,m-1]区间均匀分布的。但实际上,key%m的分布同m是有关的。证明如下:key%mhttps://blog.csdn.net/qyj19920704/article/details/123322666?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-123322666-null-null.pc_agg_new_rank&utm_term=hashtable%E4%B8%BA%E4%BB%80%E4%B9%88%E9%BB%98%E8%AE%A4%E4%B8%BA11&spm=1000.2123.3001.4430)
中间的证明,我不是很认可,因为他举例的是和 m有公约数的key,用一定条件的key来举证在所有m的位置不均匀本身就是断章取义,比如:m=9,那么公约数=3,那么key的范围只是局限于如(12、15、18、21、24、27。。),所在位置index也就是 3、6、0;但是如果key为任意数,则index的位置为 1、2、3、4、5、6、7、8、0,均匀分布;所以举证不成立;
那是不是结果就不正确呢,我认为不是,上面所说的前提的key是均匀分布的,但是实际上怎么样呢?我们知道这个key在HashTable中,是根据hashcode()方法来的,方法是属于其他对象的,并不能确定一定是均匀的,所以我们认为key不一定是均匀分布
这时候我们用一个质数(至少也是个奇数)作为桶的数量,能更大程度的减少冲突
而初始化的值也不适合过大(影响空间),所以是11
2.HashMap
HashTable是取模,HashMap却是 & ,所以只能是2的n次方(二进制都是1),这样才会尽量减少冲突,hash方法是HashMap内部的,如下
把高位的变化,通过异或运算,也映射到低位,这样,在 & 的时候才能减少冲突
参考自:language agnostic - Why should hash functions use a prime number modulus? - Stack Overflowhttps://stackoverflow.com/questions/1145217/why-should-hash-functions-use-a-prime-number-modulus
为什么HashTable的初始化因子是11,HashMap却是16相关推荐
- map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)
1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化: HashMap map = new HashMap ...
- JAVASCRIPT 取得当前时间,包括农历时间 时间格式:2011年11月8日 16:54 星期二 农历辛卯年(兔) 十月十三 申时...
JAVASCRIPT 取得当前时间,包括农历时间 时间格式:2011年11月8日 16:54 星期二 农历辛卯年(兔) 十月十三 申时 写成了一个Js包(附件里)里了,直接调用函数就行 测试代码: & ...
- 结构体中初始化vector resize_Java-深入HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...
- 48. DDR2内存初始化代码分析-11
现在的UART初始化代码,并显示了地址0xE000 0000里面的内容. /** Memory Setup stuff - taken from blob memsetup.S** Copyright ...
- 微信回应「10 元就能在朋友圈改定位」;谷歌官方首次提及 Android 11;Node 8.16.2 发布 | 极客头条...
快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...
- SUSE 11 安装sybase ASE 16.0 SP 02安装全过程
SUSE系统下安装Sybase数据库 参考文档: https://wiki.deepin.io/mediawiki/index.php?title=Sybase_%E5%AE%89%E8%A3%85% ...
- 中科蓝讯通过注册:年营收11亿 拟募资16亿
雷递网 雷建平 5月30日报道 深圳市中科蓝讯科技有限公司(简称:"中科蓝讯")日前通过注册,准备在科创板上市,计划募资15.96亿元. 其中,4.16亿用于智能蓝牙音频芯片升级项 ...
- 2018年11月29日 16点50分 小苗苗出生了
print("I love U , my daughter") 转载于:https://www.cnblogs.com/python1988/p/10059419.html
- 软导作业2016年11月27日16:32:47
Bubble Sort the list: 33, 56, 17, 8, 95, 22.Make sure the final result is from small to large.Write ...
最新文章
- 自定义圆环progressbar
- sqlite 模糊匹配日期_sql模糊查询和根据日期筛选
- VTK:图片之ImageGridSource
- 6进程原语:wait()和waitpid()函数
- 基于NEON指令的图像旋转加速【armv7】
- VC维与DNN的Boundary
- 7-4 统计工龄 (20 分)(C语言实现)
- 我们正处在“后开源”时代?
- 别以为JDK8有了红黑树,HashMap就不会有死循环问题!
- linux虚拟机按键不好用,Linux 虚拟机 vim使用delete键没有退格效果
- 史上最全的前端十大经典算法,赶紧收藏起来吧
- RCE 0day影响数万台QNAP SOHO NAS 设备
- ubuntu为python处理图片安装图片数据增强库imgaug
- CMD 控制台中文乱码
- NSString Unicode
- SQL(10)_PRIMARY KEY 约束
- 泛泛而谈的菜鸟学习记录(五)—— Compute Shader
- SwiftUI OCR功能大全之 基于 SwiftUI 构建文档扫描仪
- 华为华为Mate30pro青春版参数配置
- 标准正态分布函数表的程序实现