【问题标题】:Java HashTable LoadFactorJava HashTable 负载因子
【发布时间】:2012-03-18 21:01:28
【问题描述】:

Java Hashtable 有一个构造函数,您可以在其中指定 loadFactor。但是,如果知道 initialCapacity (n),那么指定 loadFactor 的意义何在?

假设它的桶数组的大小是恒定的,构造函数Hashtable(int initialCapacity, float loadFactor) 只需创建一个容量大于 initialCapacity 的 Hash Table 以确保正确的 loadFactor 吗?

【问题讨论】:

  • 负载因子表示何时调整数组大小。更高的负载系数意味着稍后调整大小和更多的冲突。
  • 问题在问什么,我认为(以及为什么我认为这是一个有趣的问题)是:他们真的只是按照使用 initialCapacity 盲目地给出初始大小吗?因为,如果是这样,它们将需要在添加 initialCapacity 值时调整大小(除非 loadFactor 为 1)。因此,假设initialCapacity 通常是对将添加多少个值的准确估计,那么计算初始大小以便可以在不调整大小的情况下添加initialCapacity 点不是更有意义吗?换句话说:初始容量是指初始表大小还是初始容量
  • @andrewcooke:我明白你的意思,但根据the Javadoc,“容量是哈希表中buckets的数量"(原文为斜体),所以这里没有矛盾——也许只是用词不当。
  • 您还在回答中说它们只是提示。但是,在实践中,至少对于 gnu 类路径,您是正确的 - developer.classpath.org/doc/java/util/HashMap-source.html
  • sun 类似,但向上取整为 2 的幂 - kickjava.com/src/java/util/HashMap.java.htm

标签: java data-structures


【解决方案1】:

假设它的桶数组的大小是恒定的,[…]

这个假设是不正确的。必要时调整bucket数组的大小,保证非空bucket的比例最多为loadFactor

(注意:the Javadoc 声明“初始容量和负载因子参数只是实现的提示。关于何时以及是否调用 rehash 方法的确切细节取决于实现”,因此上述内容应该'不作为严格保证,但这是一般行为。)

【讨论】:

    【解决方案2】:

    因为它只是初始容量。 HashMap 是一个动态结构;您可以超过使用负载因子的初始容量 - 知道何时扩展。

    (如果你的意思是说知道你永远不会超过最初的能力,那么数据结构无法预测你的意图;它是一种数据结构,而不是千里眼的 AI ;) )。

    【讨论】:

      【解决方案3】:

      如果您确切知道表的大小,则将负载因子设为 1。该类是为每个人编写的——包括人们想要增加数组大小的可能情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-26
        • 2019-11-27
        • 1970-01-01
        • 2013-08-27
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        相关资源
        最近更新 更多