4

由于 HashMap 和 HashSet 允许空对象,这些“空”对象的哈希值是多少?它是如何在 java 中计算/处理的?

4

2 回答 2

6

openJDK 内置的 HashMap 只是将空引用放入数组中用于保存条目的第一个存储桶中

409     private V putForNullKey(V value) {
410         for (Entry<K,V> e = table[0]; e != null; e = e.next) {
411             if (e.key == null) {
412                 V oldValue = e.value;
413                 e.value = value;
414                 e.recordAccess(this);
415                 return oldValue;
416             }
417         }
418         modCount++;
419         addEntry(0, null, value, 0);
420         return null;
421     }
于 2012-06-25T05:55:10.397 回答
2

例如HashMap,它只是一个特例。请参阅下面我从 JDK 1.6 获取的源代码:

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

}

/**
 * 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;
}
于 2012-06-25T05:55:30.450 回答