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