源码学习【HashMap第二篇】hashMap为什么size 是2的 n次方倍
這里,因為hashmap求數(shù)組位置的時候都是直接hashcode&數(shù)組大小,以前我只是想到一個數(shù)&一個數(shù)肯定會小,可以使得index在size之內(nèi)取值。沒有考慮到hash碰撞的問題,后來看到一篇博客后才理解。
首先取模操作時可以保證均分的,但是取模操作性能比較差,所以hashMap使用了近乎取模的&,并且是與上一個size-1的數(shù),達成了變相取模的操作。
但是這時候,size是不是2的 n次方倍就至關(guān)重要了。
?
舉例如下,如果數(shù)組大小是15(非2次方冪)和16(2次方冪)的區(qū)別。
?
1110(15-1)&hashcode
1111(16-1)&hashcode
假設(shè)hashcode從 1 到30,我們來看看結(jié)果:
| 1110 | 1111 |
| 1(0001)&1110 = 0? | 1(0001)&1111 = 1 |
| 2(0010)%1110 = 2 | 2(0010)%1111 = 2 |
| 3(0011)%1110= 2 | 3(0011)%1111= 3 |
| 4(0100)&1110 = 4 | 4(0100)&1111 = 4 |
| 5(0101)&1110 = 4 | 5(0101)&1111 = 5 |
? 。。。。。。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
可以明顯的看出來,在15的時候,這種&操作代替取模操作的特點不存在,也就是說,不能保證hashcode對應(yīng)的key放到數(shù)組均分,size = 15的時候,明顯所有尾數(shù)帶1的數(shù)組位置上都不會有值。而后者 16 就可以保證均分,避免了摸操作,又均勻分配。這就是為什么hashMap的 size 一定是2的 n次方倍
?
總結(jié)
以上是生活随笔為你收集整理的源码学习【HashMap第二篇】hashMap为什么size 是2的 n次方倍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUG总结—— No mapping f
- 下一篇: 算法—2,记一个自己的算法题 计算