2的n次冪與二進制位全爲1之間的聯繫,只差一個1

現象:
2 ^ 3 = 8 = (1+2+4) +1 =(2 ^ 0+2 ^ 1+2 ^ 2)+1 即2 ^ 3 - 1=(2 ^ 0+2 ^ 1+2 ^ 2)
2 ^ 4 = 16 = (1+2+4+8) +1 =(2 ^ 0+2 ^ 1+2 ^ 2+2 ^ 3)+1 即2 ^ 4 - 1=(2 ^ 0+2 ^ 1+2 ^ 2+2 ^ 3)
觀察上述現象,可以發現2的n次冪等於2的0次冪到2的(n-1)次冪的所有值相加後再加1.而2的0次冪到2的(n-1)次冪是連續的,對應到二進制的位裏面從左往右第1到第n連續n個數,就全是連續的1啦,
在HashMap中計算數組下標時,就利用到了這一特性:數組長度爲2 ^ n(通過HashMap的tableSizeFor(int cap)方法得以保證),在put(key,value)時,hash(key)&(2 ^ n-1),這樣可以保證與hash(key)進行與的位運算時,能夠充分的散列,使得添加的元素均勻分佈到HashMap的每個位置上,減少hash碰撞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章