调用场景:
1.初始化数组 table
2.当数组 table 的 size 达到阙值时进行扩容
实现过程:
<0 | >0 | |||
---|---|---|---|---|
进行初始化 | 进行扩容,扩容成两倍 | |||
调用了无参构造器 | 没有调用无参构造器 | 将元素重新进行与运算复制到新的散列表中 | ||
使用默认的大小和阙值<阈值 12 | 使用构造函数中初始化的容量 | |||
容量是 tableSizefor 计算后的 2 的次幂数 |
通过判断旧数组的容量是否大于 0 来判断数组是否初始化过。
如果小于 0:进行初始化,判断是否调用无参构造器。
如果调用了无参构造器: 使用默认的大小和阙值<阈值 12.
阀值=默认大小为 16 乘以负载因子 0.75。
如果没有调用无参构造器: 使用构造函数中初始化的容量, 当然这个容量是经过 tableSizefor 计算后的 2 的次幂数) 。
如果大于 0: 进行扩容,扩容成两倍(小于最大值的情况下),之后在进行将元素重新进行与运算复制到新的散列表中。
概括的讲:
扩容需要重新分配一个新数组,新数组是老数组的 2 倍长,然后遍历整个老结构,把所有的元素挨个重新 hash 分配到新结构中去。
PS:可见底层数据结构用到了数组,到最后会因为容量问题都需要进行扩容操作。