当前位置: 首页 > 面试题库 >

为什么Hashtable 11的initialCapacity为HashMap,而HashMap中的DEFAULT_INITIAL_CAPACITY为16并要求2的幂?

阳英朗
2023-03-14
问题内容

比较JDK 1.6中的HashMapHashtable源代码,我在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

根据那篇文章,转换为2的幂的主要原因是位掩码比整数除法快。这并非没有不利后果,其中一位原始作者对此进行了解释:

Joshua Bloch
:使用2的幂的缺点是,生成的哈希表对哈希函数(hashCode)的质量非常敏感。至关重要的是,输入中的任何更改都必须影响哈希值的低位。(理想情况下,它应该以相同的可能性影响散列值的所有位。)因为我们不能保证这是真的,所以当我们切换到2的幂时,我们使用了一个次要(或“防御性”)散列函数。哈希表。在屏蔽低位之前,将此哈希函数应用于hashCode的结果。它的工作是将信息分散到所有位上,尤其是分散到低位位上。当然它必须
非常 运行 __速度很快,否则您将失去切换到2的幂的表格的好处。
1.4中原来的辅助哈希函数证明是不够的。我们知道这是理论上的可能性,但我们认为它不会影响任何实际数据集。我们错了。备用二级哈希函数(由我借助计算机开发)具有强大的统计特性,几乎可以保证良好的存储桶分配。



 类似资料:
  • 问题内容: 看到以下内容时,我正在浏览Java的HashMap源代码 我的问题是为什么这个要求首先存在?我还看到,允许使用自定义功能创建HashMap的构造函数将其转换为2的幂: 为什么容量总是必须是2的幂? 另外,执行自动重新哈希处理后,究竟会发生什么?哈希函数也改变了吗? 问题答案: 映射必须计算出将哪个内部表索引用于任何给定键,并将任何值(可能为负)映射到range中的值。when 是2的幂

  • 本文向大家介绍HashMap 的长度为什么是2的幂次方?相关面试题,主要包含被问及HashMap 的长度为什么是2的幂次方?时的应答技巧和注意事项,需要的朋友参考一下 为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一

  • 本文向大家介绍请问,Object作为HashMap的key的话,对Object有什么要求吗?相关面试题,主要包含被问及请问,Object作为HashMap的key的话,对Object有什么要求吗?时的应答技巧和注意事项,需要的朋友参考一下 考察点:哈希表 要求Object中hashcode不能变。

  • 问题内容: 我正在将值放入形式的哈希图中, 我想使用map方法创建一个列表。 要么 但是,它将引发异常: 线程“主”中的异常java.lang.ClassCastException: java.util.HashMap $ Values无法转换为java.util.List 但是它允许我将其传递给列表的创建: 问题答案: 说明 因为返回a ,而不能将a 转换为an ,所以得到。 我建议使用构造函数

  • 本文向大家介绍请你解释HashMap的容量为什么是2的n次幂?相关面试题,主要包含被问及请你解释HashMap的容量为什么是2的n次幂?时的应答技巧和注意事项,需要的朋友参考一下 考点:集合 负载因子默认是0.75, 2^n是为了让散列更加均匀,例如出现极端情况都散列在数组中的一个下标,那么hashmap会由O(1)复杂退化为O(n)的。

  • 问题内容: 我是泛型新手,所以不确定我的问题的答案是否是真的。在下面的代码中,对一个对象条目的键进行大小写需要什么? 它似乎很容易被替换 更多参考: 问题答案: 这是一种极端的优化措施,对于通用编程实践来说可能不是必需的。这是一个可以回答您问题的讨论。下面的语句是从该帖子中复制的: 这是Doug Lea流行的一种编码风格。这是一个极端的优化,可能没有必要。您可以期望JIT进行相同的优化。(您可以尝