【发布时间】:2016-06-24 05:56:52
【问题描述】:
当 HashSet 的初始容量(即 16)被填满时,如何计算新容量?公式是什么?
例如: 随着数组列表的大小按公式增加 新增容量=(当前容量*3/2)+1
对于向量它是 新增容量=(当前容量*2)
【问题讨论】:
-
欢迎来到 Stackoverflow。分享你到目前为止尝试过的代码。
标签: java collections hashset
当 HashSet 的初始容量(即 16)被填满时,如何计算新容量?公式是什么?
例如: 随着数组列表的大小按公式增加 新增容量=(当前容量*3/2)+1
对于向量它是 新增容量=(当前容量*2)
【问题讨论】:
标签: java collections hashset
当负载系数达到(0.75) 时,HashSet 容量为doubled。
正如documentation 解释的那样:
负载因子是哈希表允许的满度的度量 在其容量自动增加之前获取。当数 哈希表中的条目超过负载因子和 当前容量,哈希表被重新哈希(即内部 数据结构被重建),使得哈希表大约有 两倍桶数。
例子:
HashSet 的初始容量为16。当负载系数(0.75)达到时,即16 * 0.75 = 12;在插入12th 元素时,容量为doubled,即变为32。
【讨论】:
由于hashset在内部使用hashmap,所以每次放的时候都会检查入口数组的阈值,默认情况下
static final int ALTERNATIVE_HASHING_THRESHOLD_DEFAULT = Integer.MAX_VALUE;
它会根据负载因子调整它的大小
int capacity = roundUpToPowerOf2(toSize);
threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
table = new Entry[capacity];
【讨论】:
HashSet是使用HashMap实现的,其中HashMap的所有值都指向单个对象,HashMap的key组成HashSet Values。
HashSet 的初始容量 = 16,负载因子 = 0.75,阈值 = 75% 容量
这意味着每当向 HashSet 添加新值时,都会根据阈值检查其大小,如果大小超过阈值,则 HashSet 将调整大小。 调整大小会使表格大小变为当前大小的两倍。因此,容量增加了一倍,阈值设置为新容量的 75%。
这表示只要 HashSet 的大小等于或超过其容量的 75%,就会发生调整大小。
【讨论】:
HashSet 由 HashMap 支持。根据grepcode,每次需要增加时,大小都会翻倍。这是addEntry 方法的代码,它是调用的内部方法,用于实际向表中添加新条目。
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
请注意,这是一个实现细节,可能随时更改。
另请注意,如果您需要的信息不在 Javadoc 中(即实现细节),则当您对某些库类的工作方式有疑问时,查看源代码始终应该是您的第一个资源。
【讨论】: