HashMap中的空键和值

时间:2013-08-19 10:24:36

标签: java hashmap

HashMap允许一个null个密钥和多个null值。

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

3 个答案:

答案 0 :(得分:3)

HashMap 定义了两个private方法来处理 null 键:

    getForNullKey()方法调用的
  • get(K key),如果密钥为 null ,~~和~~
  • putForNullKey(V value),如果密钥为 put(K key, V value) ,则从null方法调用。

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

没有什么可以担心处理空值。它们仅被视为正常值。

答案 1 :(得分:2)

如果你检查source code它正在维护不同的方法来处理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     }

答案 2 :(得分:0)

在HashMap中处理Null键和值

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

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

Null键是在HashMap中专门处理的, putForNullKey(V值)和getForNullKey()有两种不同的方法。稍后是卸载版本的get()来查找null键。 空键始终映射到索引0。

为了在两个最常用的操作(get和put)中执行,这个空案例被拆分成单独的方法,但在其他操作中包含条件。

简而言之,在HashMap中使用null键时不使用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;
}