为什么HashMap的容量是2的倍数呢?

有两个主要原因:

  1. 方便哈希取余运算: 将元素放置在table数组中时,通常是通过计算hash值对数组大小取余来确定位置。在HashMap中,使用了hash值 & (数组大小-1)的位运算来定位元素,与使用取余操作达到相同的效果。而HashMap的容量选择为2的倍数,意味着该数的二进制表示只有一位为1,例如16(二进制为10000),32(二进制为100000),64(二进制为1000000)等。这样,通过将hash值 & (数组大小-1)进行位运算,就可以得到与取余操作相同的效果,并且位运算比取余操作更高效。
  1. 扩容时的元素迁移: 当HashMap需要进行扩容时,新的容量也选择为2的倍数。这样,在扩容过程中,已经发生hash碰撞的元素能够完美地转移到新的table中。如果容量不是2的倍数,那么在进行元素迁移时,可能会导致原来发生碰撞的元素分布不均匀,增加了后续操作的复杂性和碰撞的可能性。

collection-17.png

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题