HashMap中的NULL键的Hashcode

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

来自HashMap:

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

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

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

  /** * Offloaded version of put for null keys */ private V putForNullKey(V value) { for (Entry 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; } 

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

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

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