HashMap с null-ключом: сколько записей выведет вывод
Кандидат смотрит на код с put("Java", ...), повторным put по тому же ключу "Java" и put(null, 666), и почти всегда ошибается в подсчёте итоговых записей.
Ошибка в двух местах сразу. Первое: повторный put по существующему ключу не добавляет новую запись — он перезаписывает значение у старой. Размер карты не меняется. Второе: HashMap, в отличие от Hashtable и ConcurrentHashMap, спокойно принимает null в качестве ключа — такая запись существует и учитывается в size().
Для null-ключа HashMap использует фиксированный хеш 0 и всегда кладёт его в нулевой бакет. Это единственная запись, у которой нет вызова hashCode() на самом объекте — потому что объекта нет.
Map map = new HashMap<>(); map.put("Java", 1); map.put("JavaScript", 2); map.put("Python", 3); map.put("Java", 100); // перезапись map.put(null, 666); // отдельный ключ
System.out.println(map.size());
Результат — 4: Java, JavaScript, Python и null. Значение по ключу "Java" при этом стало 100, а не 1.
Следующий вопрос обычно про ConcurrentHashMap: почему там null-ключ и null-значение бросают NullPointerException. Причина не в блокировках — в конкурентной карте null-значение из get() неотличимо от "ключа нет", а это ломает атомарные операции вроде putIfAbsent.
Размер карты считает уникальные ключи, а не количество вызовов put — и null среди них полноправный ключ.
Тренажёр: 900+ вопросов и задач, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки
· 10 ч
Про null-ключ в нулевом бакете любят спрашивать, и про то, что TreeMap его уже не примет.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён