HashMap 将容量设计为 2 的幂主要有两个原因。

  • 第一,当容量 n 是 2 的幂时,n-1 的二进制低位全部为 1,因此可以通过 (n-1) & hash 高效计算桶下标,同时充分利用 hash 的低位信息。
  • 第二,HashMap 扩容通常扩大为原来的两倍,因此扩容后只需要判断 hash 在 oldCap 对应的那一位是 0 还是 1,就可以确定节点保持原位置还是移动到 原位置 + oldCap,从而简化 JDK 8 的扩容迁移。