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