Я просто читал о различии между классами HashMap и HashTable в java. Там я нашел разницу в том, что предыдущий разрешает нулевой ключ, а затем не дает ему привилегий. Что касается работы HashMap, то я знаю, что он вызывает метод hashcode на ключе для поиска ведра, в котором должна быть размещена эта пара значений ключа. Вот мой вопрос: Как вычисляется hashcode для нулевого значения или есть ли значение по умолчанию для hashcode нулевого ключа (если это так, укажите значение)?
Hashcode для NULL-ключа в HashMap
Ответ 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 ведет себя одинаково: у вас не может быть двух разных сопоставлений для нулевого ключа (так же, как вы не можете использовать какой-либо другой ключ). Это не особый случай, в контексте вашего вопроса.