簡體   English   中英

當HashSet的初始容量(即16)被填滿時,如何計算新容量? 公式是什么?

[英]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%,就會發生調整大小。

HashSetHashMap支持。 根據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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM