哈希映射中 NULL 键的哈希代码

2022-09-04 00:55:01

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


答案 1

从哈希地图:

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

如果你进一步看,你会看到空总是去到bin 0


答案 2

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

 /**
 * 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;
}