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碰撞

猜你喜欢

转载自blog.csdn.net/u010425839/article/details/106252604