准备用HashMap存1w条数据,构造时传10000还会触发扩容吗

从构造方法的逻辑可以看出,HashMap 并不是直接使用外部传递进来的 initialCapacity,而是经过了 tableSizeFor() 方法的处理,再赋值到 threshole 上。

  1.  
    static final int tableSizeFor(int cap) {
  2.  
    int n = cap - 1;
  3.  
    n |= n >>> 1;
  4.  
    n |= n >>> 2;
  5.  
    n |= n >>> 4;
  6.  
    n |= n >>> 8;
  7.  
    n |= n >>> 16;
  8.  
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
  9.  
    }

在 tableSizeFor() 方法中,通过逐步位运算,就可以让返回值,保持在 2 的 N 次幂。以方便在扩容的时候,快速计算数据在扩容后的新表中的位置。

那么当我们从外部传递进来 1w 时,实际上经过 tableSizeFor() 方法处理之后,就会变成 2 的 14 次幂 16384,再算上负载因子 0.75f,实际在不触发扩容的前提下,可存储的数据容量是 12288(16384 * 0.75f)。

这种场景下,用来存放 1w 条数据,绰绰有余了,并不会触发我们猜想的扩容。