(面试题)HashMap的容量为什么是2的n次方

355 阅读1分钟

这个可以看一下HashMap的源码,我看的版本是jdk1.8版本的

  • put方法:需要判断这个元素应该放到哪个桶里,使用的算法是(n-1) & 这个元素的hash值。这里的n指的是hashmap的大小,如果n不是2的幂次方,n-1的二进制就不是11111的格式,比如10101,会导致有些桶永远不会被使用到
  • 扩容方法:这里HashMap在扩容的时候,会用到n的2次方的性质,判断高位是0还是1,决定留在旧桶还是到新桶

扩展

# HashMap是如何保证容量是n的2次方的?
答:这个可以看一下HashMap构造方法的源码,里面有个tableSizeFor能够保证传进来的数字被转化为2的幂次方,
使用了特别巧妙的五次位运算,我到现在还记得!

源码:n是传进来的容量,比如你传9进来,后面会通过这个方法转化为16
n |= n>>1
n |= n>>2
n |= n>>4
n |= n>>8
n |= n>>16
最后需要n = n + 1

举例说明: 假设n的二进制表示为 1001
1001与或上1001右移一位,等于 1001 | 0100 = 1101
1101与或上1101右移两位,等于 1101 | 0011 = 1111
...
1111 加上1 等于 10000,也就是2的幂次方