Java 哈希表的负载因子和容量

Java 哈希表的负载因子和容量,java,hash,Java,Hash,当哈希表中的条目数超过负载系数和当前容量的乘积时,容量是如何增加的?这取决于底层实现。例如,在HashMap中,底层存储是一个数组: transient Entry[] table; Entry对象包含键和值。当容量不足时(如您所说,超出负载系数与当前容量的乘积),将创建一个新数组,并将旧值复制到其中 请参阅OpenJdk 7的说明,并查找void resize(int-newCapacity)。方法中最重要的行是: Entry[] newTable = new Entry[newCapaci

当哈希表中的条目数超过负载系数和当前容量的乘积时,容量是如何增加的?

这取决于底层实现。例如,在HashMap中,底层存储是一个数组:

transient Entry[] table;
Entry对象包含键和值。当容量不足时(如您所说,超出负载系数与当前容量的乘积),将创建一个新数组,并将旧值复制到其中

请参阅OpenJdk 7的说明,并查找
void resize(int-newCapacity)
。方法中最重要的行是:

Entry[] newTable = new Entry[newCapacity];   //create the new table
transfer(newTable);                          //transfer and rehash the data
table = newTable;                            //from now on use the new table
threshold = (int)(newCapacity * loadFactor); //compute the new threshold

threshold
是再次增大大小之前可以包含的最大元素数
transfer()
还会重新灰化元素,因此与元素的原始位置相比,元素可能存储在不同的数组索引中。您可以查看代码,它的阅读非常简单。

负载因子是在自动增加哈希表容量之前,允许哈希表达到的满度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,通过调用rehash方法来增加容量

这里是一个再灰化方法的一瞥

 int oldCapacity = table.length;
Entry[] oldMap = table;

int newCapacity = oldCapacity * 2 + 1;
Entry[] newMap = new Entry[newCapacity];
正如您所看到的,一旦负载系数和当前容量的乘积增加阈值,它实际上会使入口[]的容量加倍

有关更多详细信息,请参见哈希表的rehash方法


创建新哈希表时,会使用默认大小和加载因子创建该哈希表

源代码

public Hashtable() {
        this(11, 0.75f);
}
当您向其中添加元素时

它检查是否有错误

if (count >= threshold) {

}
分别创建一个新的数组和副本,如Stivlo所说

私有瞬态条目[]表