当散列表中的条目数超过负载因子和当前容量的乘积时,容量如何增加?
答案 0 :(得分:5)
这取决于底层实现。例如,在HashMap中,底层存储是一个数组:
transient Entry[] table;
Entry对象包含键和值。当容量不足时(正如您所说的那样,超过了负载系数和当前容量的乘积),将创建一个新数组并将旧值复制到其中。
请参阅sourcecode of HashMap了解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()
也重新元素,因此元素可能存储在不同的数组索引中,与原始位置相比较。您可以查看代码,阅读起来非常简单。
答案 1 :(得分:0)
负载系数衡量哈希表在其容量自动增加之前可以获得多长。当哈希表中的条目数超过加载因子和当前容量的乘积时,通过调用rehash方法来增加容量。
这里是rehash方法的一瞥
int oldCapacity = table.length;
Entry[] oldMap = table;
int newCapacity = oldCapacity * 2 + 1;
Entry[] newMap = new Entry[newCapacity];
正如您所看到的,一旦负载系数和电流容量的乘积增加阈值,它实际上会使Entry []的容量加倍。
有关详细信息,请参阅哈希表的rehash方法。
答案 2 :(得分:0)
创建新的哈希表时,会使用默认大小和加载因子创建它。
源代码
public Hashtable() {
this(11, 0.75f);
}
将元素添加到其中
检查
if (count >= threshold) {
}
分别创建一个新数组并复制为Stivlo所说的。
private transient Entry []表;