典型回答
即使初始化 HashMap 的容量为 17,那么它的实际容量却是 32。
这是因为 HashMap 的容量只能为 2 的 N次方,这是 HashMap 的源代码中的实现,无论用户输入的是多少,它总会通过计算,得到第一个比他大的2的N 次方进行返回,这一点可以在 HashMap 的源码中找到,如下源码所示:
方法上的注释也写的很清楚 "Returns a power of two size for the qiven target capacity.” = “返回给定目标容量的2次方大小。”
上面代码的含义就是根据用户传入的容量值(cap 变量),通过计算,得到第一个比他大的 2 的幂并返回,我们编写代码来测试一下 tableSizeFor 方法:
public class TableSizeForExample {
public static void main(String[] args) {
int result = tableSizeFor(17);
System.out.println(result);
}
static final int MAXIMUM_CAPACITY = 1 << 30;
static final int tableSizeFor(int cap) {
int n = -1 >>> Integer.numberOfLeadingZeros(cap - 1);
return (n < 8) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
}
以上程序的执行结果为:
从上述结果可以看出,传递的是 17,但最终生成的容量为 32(2 的5次方)