[英]When the initial capacity of the HashSet (i.e 16) gets filled up how is the new capacity is calculated? What is the formula?
當HashSet的初始容量(即16)被填滿時,如何計算新容量? 公式是什么?
例如:隨着數組列表的大小增加公式New capacity =(current capacity * 3/2)+ 1
對於向量,它是新容量=(當前容量* 2)
當達到負載系數(0.75)
時, HashSet
容量doubled
。
正如文檔所述 :
加載因子是在自動增加容量之前允許哈希表獲取的完整程度的度量。 當哈希表中的條目數超過加載因子和當前容量的乘積時,哈希表將被重新哈希(即,重建內部數據結構),以便哈希表具有大約兩倍的桶數。
例:
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的鍵包含HashSet值。
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中(即實現細節),那么當您對某些庫類如何工作有疑問時,查看源應始終是您的第一個資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.