初识HashMap之初始长度(二)
来源:互联网 发布:grub 添加ubuntu引导 编辑:程序博客网 时间:2024/06/07 15:15
HashMap的初始长度为16,其次在自动扩展或手动初始化时,长度必须是2的幂。
初始值选择16是为了服务从key映射到index的哈希值。
上篇文章提到过《初识HashMap(一)》,从Key映射到HashMap数组的对应位置,会用到一个Hash函数:
index = Hash("id")
如何实现一个尽量均匀分布的Hash函数呢?我们通过Key的HashCode值来做运算。
有人可能想到用取模的方式实现index = HashCode(Key) % Length ,原理是一样的,不过取模的执行效率太低,采用位运算。
我们以key为book的为例进行计算:
1.计算book的hashcode,结果为十进制的3029737,二进制的101110001110101110 1001。
2.假定HashMap长度是默认的16,计算Length-1的结果为十进制的15,二进制的1111。
3.把以上两个结果做与运算,101110001110101110 1001 & 1111 = 1001,十进制是9,所以 index=9。
可以说,Hash算法最终得到的index结果,完全取决于Key的Hashcode值的最后几位(与HashMap的长度有关)
为了尽量实现均匀分布,长度16或者其他2的幂,Length-1的值是所有二进制位全为1,这种情况下,index的结果等同于HashCode后几位的值。只要输入的HashCode本身分布均匀,Hash算法的结果就是均匀的。
如果使用的长度为10,对应的二进制为1100,则101110001110101110 1001&1100=1000
101110001110101110 1011&1100=1000
101110001110101110 1010&1100=1000
这样出现冲突的可能性更高,达不到均匀分布,所以用2的幂,对应的Length-1全是1,更有利于均匀分布
- 初识HashMap之初始长度(二)
- Python学习之初始(二)
- 初识HashMap(一)
- 初始HashMap
- 初始python(二)
- Map 的初始容量是多少(hashMap)
- ArrayList初始默认容量(长度)
- Cocos2D研究院之初识Cocos2d(二)
- Cocos2D研究院之初识Cocos2d(二)
- shell脚本之初识(二)
- core animation初识之CALayer(二)
- Flume学习笔记之初识(二)
- 初识框架之struts2(二)
- 初识Hibernate之关联映射(二)
- 初识Hibernate之关联映射(二)
- Java初始入门(二)
- python-初始篇(二)
- 初始Android之Activity和Intent(二)
- Unity3D-使用图层,锁定背景图片
- 一名前端工程师的自学之路!Js篇(11-20更新)
- C++ map;vector;list;queue;stack;set对比使用
- 3.4 输入一个三位数的整数(忽略前面的正负号)
- POJ
- 初识HashMap之初始长度(二)
- 基于卡尔曼滤波的目标跟踪 一点点想法
- 201503-3 节日 ccf
- OkHttp封装+RecyclerView显示网络请求数据
- java_day1
- 人工智能随机生成迷宫
- 比赛记录
- Android FileProvider的使用
- Scala中的apply方法