Ответ 1
из HashMap:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
...
и если вы посмотрите дальше, вы увидите, что null всегда идет в bin 0
Я просто читал о различии между классами HashMap и HashTable в java. Там я нашел разницу в том, что предыдущий разрешает нулевой ключ, а затем не дает ему привилегий. Что касается работы HashMap, то я знаю, что он вызывает метод hashcode на ключе для поиска ведра, в котором должна быть размещена эта пара значений ключа. Вот мой вопрос: Как вычисляется hashcode для нулевого значения или есть ли значение по умолчанию для hashcode нулевого ключа (если это так, укажите значение)?
из HashMap:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
...
и если вы посмотрите дальше, вы увидите, что null всегда идет в bin 0
Из исходного кода 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;
}
Если вы прочитали описание метода static int hash(int h)
в HashMap, вы обнаружите, что нулевые ключи имеют индекс 0.
Когда на карте существует нулевое значение, ключ этого значения также равен нулю. вы не можете иметь много нулевых ключей на карте. Только один нулевой ключ.
В нем четко указано, что происходит, когда вы делаете put с ключом, который уже был на карте. Конкретный случай key == null ведет себя одинаково: у вас не может быть двух разных сопоставлений для нулевого ключа (так же, как вы не можете использовать какой-либо другой ключ). Это не особый случай, в контексте вашего вопроса.