哈希映射中 NULL 键的哈希代码
2022-09-04 00:55:01
我刚刚读到Java中HashMap和HashTable类之间的区别。在那里,我发现了一个区别,以前允许空键,后来没有相同的特权。就HashMap的工作而言,我知道,它在key上调用哈希码方法,以查找要放置该键值对的存储桶。这就是我的问题:如何计算空值的哈希码或空键的哈希码是否有任何默认值(如果是这样,请指定值)?
我刚刚读到Java中HashMap和HashTable类之间的区别。在那里,我发现了一个区别,以前允许空键,后来没有相同的特权。就HashMap的工作而言,我知道,它在key上调用哈希码方法,以查找要放置该键值对的存储桶。这就是我的问题:如何计算空值的哈希码或空键的哈希码是否有任何默认值(如果是这样,请指定值)?
从哈希地图:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
...
如果你进一步看,你会看到空总是去到bin 0
从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;
}