哈希表的负载系数和容量

时间:2011-11-18 17:18:38

标签: java hash

当散列表中的条目数超过负载因子和当前容量的乘积时,容量如何增加?

3 个答案:

答案 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方法。

Rehash Method

答案 2 :(得分:0)

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

源代码

public Hashtable() {
        this(11, 0.75f);
}

将元素添加到其中

检查

if (count >= threshold) {

}

分别创建一个新数组并复制为Stivlo所说的。

private transient Entry []表;