为什么Hashtable的initialCapacity是11,而HashMap的DEFAULT_INITIAL_CAPACITY是16并且需要2的幂?

2024-02-22

比较HashMap and Hashtable在JDK 1.6的源代码中,我在HashMap中看到了以下代码:

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;

    int capacity = 1;
    while (capacity < initialCapacity)
        capacity <<= 1;

然而,在 Hashtable 中,我看到了这一点:

table = new Entry[initialCapacity];

public Hashtable() {
    this(11, 0.75f);
}

所以我的问题是: 为什么HashMap需要2的幂作为初始容量,而Hashtable选择11作为默认初始容量? 我认为这与 Hashtable 是线程安全的并且不允许空键或值无关。


下面的文章详细解答了这个问题:HashMap 需要更好的 hashCode() - JDK 1.4 Part II http://www.javaspecialists.eu/archive/Issue054.html.

根据该文章,转向二次方大小的主要原因是位掩码比整数除法更快。这并非没有不利后果,原作者之一对此进行了解释:

约书亚·布洛赫 http://en.wikipedia.org/wiki/Joshua_Bloch:使用二的幂的缺点是生成的哈希表对哈希函数(hashCode)的质量非常敏感。输入的任何变化都必须影响哈希值的低位。 (理想情况下,它应该以相同的可能性影响哈希值的所有位。)因为我们不能保证这是真的,所以当我们切换到二的幂时,我们放入辅助(或“防御”)哈希函数哈希表。在屏蔽掉低位之前,该哈希函数会应用于 hashCode 的结果。它的工作是将信息分散到所有位上,特别是分散到低位位上。当然必须运行very快速,否则您将失去切换到两倍大小的表格的好处。 1.4 中原来的二级哈希函数被证明是不够的。我们知道这是理论上的可能性,但我们认为它不会影响任何实际数据集。我们错了。替换二级哈希函数(我在计算机的帮助下开发的)具有强大的统计特性,几乎可以保证良好的存储桶分布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Hashtable的initialCapacity是11,而HashMap的DEFAULT_INITIAL_CAPACITY是16并且需要2的幂? 的相关文章

随机推荐