源码学习【HashMap第二篇】hashMap为什么size 是2的 n次方倍
生活随笔
收集整理的這篇文章主要介紹了
源码学习【HashMap第二篇】hashMap为什么size 是2的 n次方倍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這里,因為hashmap求數組位置的時候都是直接hashcode&數組大小,以前我只是想到一個數&一個數肯定會小,可以使得index在size之內取值。沒有考慮到hash碰撞的問題,后來看到一篇博客后才理解。
首先取模操作時可以保證均分的,但是取模操作性能比較差,所以hashMap使用了近乎取模的&,并且是與上一個size-1的數,達成了變相取模的操作。
但是這時候,size是不是2的 n次方倍就至關重要了。
?
舉例如下,如果數組大小是15(非2次方冪)和16(2次方冪)的區別。
?
1110(15-1)&hashcode
1111(16-1)&hashcode
假設hashcode從 1 到30,我們來看看結果:
| 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對應的key放到數組均分,size = 15的時候,明顯所有尾數帶1的數組位置上都不會有值。而后者 16 就可以保證均分,避免了摸操作,又均勻分配。這就是為什么hashMap的 size 一定是2的 n次方倍
?
總結
以上是生活随笔為你收集整理的源码学习【HashMap第二篇】hashMap为什么size 是2的 n次方倍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUG总结—— No mapping f
- 下一篇: Java线程 Thread 的6种状态以