JAVA基础集合框架【四】HashMap之源码分析确定桶在数组索引位置
文章首发于:clawhub.club
hash算法的优略直接影响到HashMap的性能。
扰动函数源码:
1 | /** |
key.hashCode()函数调用的是key键值类型自带的哈希函数,返回int型散列值。直接用这个结果去映射键值对的时候,大概有40亿的映射空间。
h ^ (h >>> 16):让hash值高位参与计算,增加扰动,优化散列值的分布。
异或运算符(^)
参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0
取模运算:
计算出key在数组中的位置
1 | (length - 1) & hash |
这个算法的由来也是数学的奇妙之处,一般取模直接用hash%length就好了,但是性能不好。当length总是2的n次方时,hash& (length-1)运算等价于对length取模,也就是hash%length,但是&比%具有更高的效率。
这也正好解释了为什么HashMap的数组长度要取2的整次幂。
与操作符(&)
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为1,结果才为1,否则为0
例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。
综合例子:
1 |
|
学习记录可能会有错误,欢迎交流。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!