HashMap中的NULL键的Hashcode

时间:2013-06-24 04:50:00

标签: java collections hashmap

我刚刚读到了Java中HashMap和HashTable类之间的区别。在那里,我发现前者允许空键以及后来不具有相同权限的区别。 就HashMap的工作而言,我知道,它在key上调用hashcode方法来查找要放置该键值对的存储区。这是我的问题: 如何计算空值的哈希码或者是否存在空键哈希码的默认值(如果是,请指定值)?

6 个答案:

答案 0 :(得分:14)

来自HashMap的

public V put(K key, V value) {
   if (key == null)
      return putForNullKey(value);
   ...

如果你进一步观察,你会看到null总是转到bin 0

答案 1 :(得分:5)

从HashMap的源代码中,如果密钥为null,则处理方式不同。没有为null生成哈希码,但它在索引0处唯一存储在具有哈希值0的内部数组中。还要注意,空字符串的哈希值也是0(如果键是字符串),但索引在哪里存储在内部数组中,确保它们不会混淆。

 /**
 * Offloaded version of put for null keys
 */
private V putForNullKey(V value) {
    for (Entry<K,V> e = table[0]; e != null; e = e.next) {
        if (e.key == null) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }
    modCount++;
    addEntry(0, null, value, 0);
    return null;
}

答案 2 :(得分:3)

如果您在HashMap中阅读static int hash(int h)方法的描述,您会发现null键的索引为0。

答案 3 :(得分:0)

当地图中存在空值时,该值的键也为空。你不能在地图中有很多空键。只有一个空键。

答案 4 :(得分:0)

它清楚地说明当您使用已经在地图中的键进行放置时会发生什么。 key == null的具体情况表现相同:你不能为null键设置两个不同的映射(就像你可以为任何其他键一样)。对于你的问题,这不是一个特例。

答案 5 :(得分:0)

内部Hashmap对密钥进行nullcheck。如果为null,则将返回0的key哈希值。

其中Hastable没有任何null检查,它将直接在键上调用hashcode方法

这就是为什么Hashtable不接受null的原因。