首页 > 编程知识 正文

hashmap扩容为什么是2的n次幂,hashmap的数组长度为什么要保证是2的幂

时间:2023-05-05 01:22:39 阅读:223403 作者:1839

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 = 0010101111 & 01010 = 0101001111 & 01101 = 0110101111 & 00111 = 00111...   

2.   当n不是2的幂次方时(11):

01011 & 00101 = 00001​01011 & 01010 = 0101001011 & 01101 = 0100101011 & 01001 = 01001...

从上边可以看出:n不是2的幂次方时,会出现不同值得到相同的结果,这种现象叫做hash碰撞。在实际代码中,出现这种情况会导致结果跟预想的不一致,为了防止碰撞发生,Java要求map的容量必须是2的幂指数。

结果

1. 使用位与运算计算效率高

2. 设置容量为2的幂指数,避免了hash碰撞产生链表,使得结果可以均匀分布

3. 提高了查询效率

​        

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。