从构造方法的逻辑可以看出,HashMap 并不是直接使用外部传递进来的 initialCapacity
,而是经过了 tableSizeFor()
方法的处理,再赋值到 threshole
上。
-
static final int tableSizeFor(int cap) {
-
int n = cap - 1;
-
n |= n >>> 1;
-
n |= n >>> 2;
-
n |= n >>> 4;
-
n |= n >>> 8;
-
n |= n >>> 16;
-
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
-
}
在 tableSizeFor()
方法中,通过逐步位运算,就可以让返回值,保持在 2 的 N 次幂。以方便在扩容的时候,快速计算数据在扩容后的新表中的位置。
那么当我们从外部传递进来 1w 时,实际上经过 tableSizeFor()
方法处理之后,就会变成 2 的 14 次幂 16384,再算上负载因子 0.75f,实际在不触发扩容的前提下,可存储的数据容量是 12288(16384 * 0.75f)。
这种场景下,用来存放 1w 条数据,绰绰有余了,并不会触发我们猜想的扩容。