4

HashMap と HashSet は null オブジェクトを許可するので、これらの「null」オブジェクトのハッシュ値は何になるでしょうか? Javaでどのように計算/処理されていますか?

4

2 に答える 2

6

openJDK に組み込まれている HashMap は、エントリを保持するために使用する配列の最初のバケットに null 参照を入れるだけです。

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 に答える