当HashSet的初始容量(即16)被填满时,如何计算新容量?公式是什么?

时间:2016-06-24 05:56:53

标签: java collections hashset

当HashSet的初始容量(即16)被填满时,如何计算新容量?公式是什么?

例如: 随着数组列表的大小增加公式 新容量=(当前容量* 3/2)+ 1

对于矢量而言 新容量=(当前容量* 2)

4 个答案:

答案 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%,就会发生调整大小。