关于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相关推荐

  1. map java 初始化赋值_Java 中 HashMap 初始化时赋值(示例代码)

    1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化: HashMap map = new HashMap ...

  2. JAVASCRIPT 取得当前时间,包括农历时间 时间格式:2011年11月8日 16:54 星期二 农历辛卯年(兔) 十月十三 申时...

    JAVASCRIPT 取得当前时间,包括农历时间 时间格式:2011年11月8日 16:54 星期二 农历辛卯年(兔) 十月十三 申时 写成了一个Js包(附件里)里了,直接调用函数就行 测试代码: & ...

  3. 结构体中初始化vector resize_Java-深入HashMap原理及内部存储结构

    本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...

  4. 48. DDR2内存初始化代码分析-11

    现在的UART初始化代码,并显示了地址0xE000 0000里面的内容. /** Memory Setup stuff - taken from blob memsetup.S** Copyright ...

  5. 微信回应「10 元就能在朋友圈改定位」;谷歌官方首次提及 Android 11;Node 8.16.2 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  6. 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% ...

  7. 中科蓝讯通过注册:年营收11亿 拟募资16亿

    雷递网 雷建平 5月30日报道 深圳市中科蓝讯科技有限公司(简称:"中科蓝讯")日前通过注册,准备在科创板上市,计划募资15.96亿元. 其中,4.16亿用于智能蓝牙音频芯片升级项 ...

  8. 2018年11月29日 16点50分 小苗苗出生了

    print("I love U , my daughter") 转载于:https://www.cnblogs.com/python1988/p/10059419.html

  9. 软导作业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 ...

最新文章

  1. 自定义圆环progressbar
  2. sqlite 模糊匹配日期_sql模糊查询和根据日期筛选
  3. VTK:图片之ImageGridSource
  4. 6进程原语:wait()和waitpid()函数
  5. 基于NEON指令的图像旋转加速【armv7】
  6. VC维与DNN的Boundary
  7. 7-4 统计工龄 (20 分)(C语言实现)
  8. 我们正处在“后开源”时代?
  9. 别以为JDK8有了红黑树,HashMap就不会有死循环问题!
  10. linux虚拟机按键不好用,Linux 虚拟机 vim使用delete键没有退格效果
  11. 史上最全的前端十大经典算法,赶紧收藏起来吧
  12. RCE 0day影响数万台QNAP SOHO NAS 设备
  13. ubuntu为python处理图片安装图片数据增强库imgaug
  14. CMD 控制台中文乱码
  15. NSString Unicode
  16. SQL(10)_PRIMARY KEY 约束
  17. 泛泛而谈的菜鸟学习记录(五)—— Compute Shader
  18. SwiftUI OCR功能大全之 基于 SwiftUI 构建文档扫描仪
  19. 华为华为Mate30pro青春版参数配置
  20. 标准正态分布函数表的程序实现

热门文章

  1. Opencv学习笔记(九)光流法
  2. PHP获取一年有多少天、一个月有多少天(最全最新)
  3. keepalived 配置文件参数详解
  4. 《程序员练习生》第2期 什么年龄开始编程最好
  5. html5文章发布模板,HTML5响应式大气文章博客模板
  6. 关于 DevOps ,咱们聊的可能不是一回事
  7. Visual Studio Code 十大效率(摸鱼)插件
  8. Python之旅计算机基础篇
  9. FLASH制作全套装备
  10. 洗衣粉和消毒液不能混用