hashMap为啥初始化容量为2的次幂
2017-02-25 16:08
190 查看
hashMap源码获取元素的位置:
static int indexFor(int h, int length) { // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2"; return h & (length-1); }
解释:
h:为插入元素的hashcode
length:为map的容量大小
&:与操作 比如 1101 & 1011=1001
如果length为2的次幂 则length-1 转化为二进制必定是11111……的形式,在于h的二进制与操作效率会非常的快,
而且空间不浪费;如果length不是2的次幂,比如length为15,则length-1为14,对应的二进制为1110,在于h与操作,
最后一位都为0,而0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能存放元素了,空间浪费相当大,更糟的是这种情况中,数组可以使用的位置比数组长度小了很多,这意味着进一步增加了碰撞的几率,减慢了查询的效率!这样就会造成空间的浪费
相关文章推荐
- hashMap为啥初始化容量为2的次幂
- hashMap为啥初始化容量为2的次幂
- 知道为啥HashMap里面的数组size必须是2的次幂?
- Java和guava关于hashmap在初始化的时候最好给个初始容量,避免扩容引起性能问题的探究。
- Java和guava关于hashmap在初始化的时候最好给个初始容量
- 知道为啥HashMap里面的数组size必须是2的次幂?
- NanguoCoffee 知道为啥HashMap里面的数组size必须是2的次幂?
- HashMap 与 ConcurrentHashMap 在初始化不同大小容量时,实际分配的空间情况
- HashMap为什么初始容量为2的次幂
- 知道为啥HashMap里面的数组size必须是2的次幂?
- 乱拔插U盘,导致U盘变成RAW未初始化格式,容量大小为0。
- Hashmap为什么容量是2的幂次,什么是负载因子
- hashmap如何初始化
- C++ 使用表示容量的当个形参来初始化容器时,有没有使用copy constructor
- Java HashMap 初始化的另一种方式
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
- Hashmap的容量为什么是2的幂次
- HashMap的默认容量和加载因子
- HashMap源码解析(初始化及put方法)