2012-06-25 3 views
4

Так как HashMap и HashSet разрешают пустые объекты, каково будет хэш-значение этих «нулевых» объектов? Как он вычисляется/обрабатывается в java?Как hashcode вычисляется для нулевого объекта

+1

Это конкретная реализация - либо бросить NPE, либо использовать 'hashCode = 0' – Bohemian

ответ

6

Метод HashMap построен в OpenJDK просто ставит пустую ссылку в первое ведро в массиве, который он использует для хранения записей

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  } 
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; 
}