3

HashMap允许一个null键和多个null值。

我想知道如何HashMap处理null键/值?我的意思是它是如何在内部处理的?

4

3 回答 3

3

HashMap定义了两种private处理null键的方法:

  • getForNullKey()get(K key)方法中调用,如果 key 是null, ~~and~~
  • putForNullKey(V value)put(K key, V value)如果 key 为 ,则从方法调用null

您可以在源代码中找到它们。

处理空值也没什么好担心的。它们仅被视为正常值。

于 2013-08-19T10:30:49.183 回答
2

如果您检查源代码 它正在使用不同的方法来处理 null

 Offloaded version of put for null keys
408 
409     private V More ...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     }



Offloaded version of get() to look up null keys. Null keys map to index 0. This null case is split out into separate methods for the sake of performance in the two most commonly used operations (get and put), but incorporated with conditionals in others.
334 
335     private V More ...getForNullKey() {
336         for (Entry<K,V> e = table[0]; e != null; e = e.next) {
337             if (e.key == null)
338                 return e.value;
339         }
340         return null;
341     }
于 2013-08-19T10:31:48.090 回答
0

在 HashMap 中处理 Null 键和值

http://javaexplorer03.blogspot.in/2015/11/how-null-key-is-handled-in-hashmap.html

由于 equals() 和 hashCode() 用于存储和检索值,在 null key 的情况下它是如何工作的?

Null 键在 HashMap 中专门处理, putForNullKey(V value) 和 getForNullKey()有两个单独的方法。后来是 get() 的卸载版本来查找空键。空键总是映射到索引 0。

为了提高两个最常用操作(get 和 put)的性能,这种 null 情况被拆分为单独的方法,但在其他操作中与条件结合。

简而言之,对于 HashMap 中的空键,不使用 equals() 和 hashcode() 方法,这是从 HashMap 中检索空值的方法。

private V getForNullKey() {
    for (Entry<K,V> e = table[0]; e != null; e = e.next) {
        if (e.key == null)
            return e.value;
    }
    return 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;
}
于 2015-11-14T14:02:55.817 回答