HashMap初始容量为什么是16(必须是2的幂次方)?
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
关键词
- hash碰撞
- 位与运算(&)
原因
在HashMap中会存在如下代码(详情参考HashMap源代码)
... (n - 1) & hash ...
在执行上述代码的时候,会进行位与运算,n为容量大小,n=16,对应的二进制是 01111 。
1. 当n是2的幂次方时(16):
- 01111 & 00101 = 00101
- 01111 & 01010 = 01010
- 01111 & 01101 = 01101
- 01111 & 00111 = 00111
- ...
2. 当n不是2的幂次方时(11):
- 01011 & 00101 = 00001
- 01011 & 01010 = 01010
- 01011 & 01101 = 01001
- 01011 & 01001 = 01001
- ...
从上边可以看出:n不是2的幂次方时,会出现不同值得到相同的结果,这种现象叫做hash碰撞。在