【问题标题】: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)被填满时,如何计算新容量?公式是什么?
【发布时间】:2016-06-24 05:56:52
【问题描述】:

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

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

对于向量它是 新增容量=(当前容量*2)

【问题讨论】:

  • 欢迎来到 Stackoverflow。分享你到目前为止尝试过的代码。

标签: java collections hashset


【解决方案1】:

当负载系数达到(0.75) 时,HashSet 容量为doubled

正如documentation 解释的那样:

负载因子是哈希表允许的满度的度量 在其容量自动增加之前获取。当数 哈希表中的条目超过负载因子和 当前容量,哈希表被重新哈希(即内部 数据结构被重建),使得哈希表大约有 两倍桶数。

例子:

HashSet 的初始容量为16。当负载系数(0.75)达到时,即16 * 0.75 = 12;在插入12th 元素时,容量为doubled,即变为32

【讨论】:

  • 谢谢!简短明了的解释!正是我需要的。
【解决方案2】:

由于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];

【讨论】:

    【解决方案3】:

    HashSet是使用HashMap实现的,其中HashMap的所有值都指向单个对象,HashMap的key组成HashSet Values。

    HashSet 的初始容量 = 16,负载因子 = 0.75,阈值 = 75% 容量

    这意味着每当向 HashSet 添加新值时,都会根据阈值检查其大小,如果大小超过阈值,则 HashSet 将调整大小。 调整大小会使表格大小变为当前大小的两倍。因此,容量增加了一倍,阈值设置为新容量的 75%。

    这表示只要 HashSet 的大小等于或超过其容量的 75%,就会发生调整大小。

    【讨论】:

      【解决方案4】:

      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 中(即实现细节),则当您对某些库类的工作方式有疑问时,查看源代码始终应该是您的第一个资源。

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 2015-01-30
        • 2020-05-17
        • 2012-01-24
        • 2012-01-11
        • 2012-10-31
        • 2018-09-25
        • 1970-01-01
        相关资源
        最近更新 更多