Hashcode для NULL-ключа в HashMap

Я просто читал о различии между классами HashMap и HashTable в java. Там я нашел разницу в том, что предыдущий разрешает нулевой ключ, а затем не дает ему привилегий. Что касается работы HashMap, то я знаю, что он вызывает метод hashcode на ключе для поиска ведра, в котором должна быть размещена эта пара значений ключа. Вот мой вопрос: Как вычисляется hashcode для нулевого значения или есть ли значение по умолчанию для hashcode нулевого ключа (если это так, укажите значение)?

Ответ 1

из HashMap:

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

и если вы посмотрите дальше, вы увидите, что null всегда идет в bin 0

Ответ 2

Из исходного кода HashMap, если ключ null обрабатывается по-разному. Не существует hashcode, сгенерированного для null, но он уникально хранится в индексе 0 во внутреннем массиве с хэш-значением 0. Также обратите внимание, что хеш-значение пустой строки также равно 0 (в случае, если ключи являются строками), но индекс, где он хранится во внутреннем массиве, гарантирует, что они не будут перемешаны.

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

Ответ 3

Если вы прочитали описание метода static int hash(int h) в HashMap, вы обнаружите, что нулевые ключи имеют индекс 0.

Ответ 4

Когда на карте существует нулевое значение, ключ этого значения также равен нулю. вы не можете иметь много нулевых ключей на карте. Только один нулевой ключ.

Ответ 5

В нем четко указано, что происходит, когда вы делаете put с ключом, который уже был на карте. Конкретный случай key == null ведет себя одинаково: у вас не может быть двух разных сопоставлений для нулевого ключа (так же, как вы не можете использовать какой-либо другой ключ). Это не особый случай, в контексте вашего вопроса.