当标签的初始容量(即16)填充时,如何计算新容量?公式是什么?
例如:随着阵列列表的大小通过公式增加新容量=(当前容量 * 3/2) 1
对于向量,它是新容量=(当前容量 * 2)
达到负载因子(0.75)
时HashSet
的容量为doubled
。
如文档所述:
负载因子是允许hash表的完整量的量度 在自动增加其容量之前获得。当数量 哈希表中的条目超过了负载因子的乘积,并且 当前容量,哈希表被重新进行(即内部 重建数据结构),使哈希表具有大约 两次桶数。
示例:
HashSet
的初始容量是16
。当达到负载因子(0.75)
时,即16 * 0.75 = 12
;在插入12th
元素时,容量为doubled
,即变为32
。
作为Hashset使用Hashmap在内部使用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的键包含哈希集值。
最初的容量= 16,负载因子= 0.75,阈值= 75% 容量
这意味着每当将新值添加到标签中时,它的大小就会针对阈值进行检查,如果大小超过阈值,则可以调整大小。调整大小使表尺寸的当前尺寸的双。因此,容量加倍,阈值设置为新容量的75%。
每当主题设置的大小等同或超过其容量的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(即实施细节)时,查看源应该始终是您的第一个资源。