最新消息:最新信息可以到系统基本设置里填写,如果不想要这一栏可以修改head.htm,将第53行到55行删除即可

hashmap 为什么初始化容量是2的幂次方

技巧资源 dedesos.com

个人了解 做下记载,不正确的当地望不吝赐教

这是hashmap初始化容量时分 对容量巨细做的处理,确保初始化容量为最近的2的幂次方

 static final int tablesizefor {
 int n = cap - 1;
 n |= n 
 n |= n 
 n |= n 
 n |= n 
 n |= n 
 return  ? 1 :  ? maximum_capacity : n + 1;
}
 结合源码加他人的材料,做如下解说:
 1.奇数不可的解说很能被承受,在核算hash的时分,确认落在数组的方位的时分,核算方法是 hash ,奇数n-1为偶数,偶数2进制的结束都是0,通过 运算结尾都是0,会添加hash抵触。
 2.为啥要是2的幂,不能是2的倍数么,比方6,10?
 2.1 hashmap 结构是数组,每个数组里边的结构是node,正常情况下,假如你想放数据到不同的方位,肯定会想到取余数确认放在那个数据里, 
 核算公式: hash % n,这个是十进制核算。在核算机中,  hash,当n为2次幂时,会满意一个公式: hash = hash % n,核算愈加高效。
 2.2 只要是2的幂数的数字通过n-1之后,二进制肯定是 ...11111111 这样的格局,这种格局核算的方位的时分,完全是由发生的hash值类决议,而不受n-1 影响。你或许会想,受影响不是更 
 好么,又核算了一下 ,hash抵触或许更低了,这儿要考虑到扩容了,2的幂次方*2,在二进制中比方4和8,代表2的2次方和3次方,他们的2进制结构类似 0000 0100 0000 1000 
 仅仅高位向前移了一位,这样扩容的时分,只需要判别高位hash,移动到之前方位的倍数就可以了,免去了从头核算方位的运算。

    与本文相关的文章

    网友最新评论