当HashSet的初始容量(即16)被填满时,如何计算新容量?公式是什么?
例如: 随着数组列表的大小增加公式 新容量=(当前容量* 3/2)+ 1
对于矢量而言 新容量=(当前容量* 2)
答案 0 :(得分:5)
当达到加载因子HashSet
时,doubled
容量为(0.75)
。
正如documentation所解释的那样:
加载因子衡量允许哈希表的填充程度 在它的容量自动增加之前得到。当数量 哈希表中的条目超出了加载因子的乘积 当前容量,哈希表重新哈希(即内部 重建数据结构),以便哈希表具有大约 两次桶的数量。
示例:
HashSet
的初始容量为16
。达到载客率(0.75)
时,即16 * 0.75 = 12
;在插入12th
元素时,容量为doubled
,即它变为32
。
答案 1 :(得分:1)
由于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];
答案 2 :(得分:0)
HashSet
支持HashMap
。根据{{3}},每次需要增加时,大小会增加一倍。这是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(即实现细节)中,那么当您对某些库类的工作方式有疑问时,查看源代码应该始终是您的第一个资源。
答案 3 :(得分:0)
HashSet是使用HashMap实现的,其中HashMap的所有值都指向单个对象,而HashMap的键包含HashSet值。
HashSet的初始容量= 16,负载因子= 0.75,阈值= 75% 容量
这意味着无论何时向HashSet添加新值,都会根据阈值检查其大小,如果大小超过阈值,则HashSet会调整大小。 调整大小会使当前大小的表格大小加倍。因此,容量加倍,阈值设置为新容量的75%。
表示只要HashSet的大小等于或超过其容量的75%,就会发生调整大小。