Этот вопрос проверяет понимание внутренней реализации HashMap в Java и особенностей работы с null-ключами.
HashMap в Java — одна из наиболее часто используемых структур данных из коллекций, которая хранит пары ключ-значение. Особенностью HashMap является возможность использовать null в качестве ключа, что отличает её от некоторых других реализаций Map, например, Hashtable, где null-ключи запрещены.
При добавлении элемента в HashMap сначала вычисляется хэш-код ключа с помощью метода hashCode(). Для null-ключа хэш-код всегда равен 0. Затем на основе этого хэш-кода и ёмкости HashMap определяется индекс бакета (корзины), куда будет помещена запись. Поскольку хэш null равен 0, запись с null-ключом всегда попадает в бакет с индексом 0.
import java.util.HashMap;
public class HashMapNullKeyExample {
public static void main(String[] args) {
HashMap map = new HashMap<>();
// Добавляем пару с null-ключом
map.put(null, 100);
System.out.println("Значение для null: " + map.get(null)); // 100
// Перезаписываем значение для null-ключа
map.put(null, 200);
System.out.println("Новое значение для null: " + map.get(null)); // 200
// Проверяем наличие null-ключа
System.out.println("Содержит null-ключ? " + map.containsKey(null)); // true
// Удаляем запись с null-ключом
map.remove(null);
System.out.println("После удаления: " + map.get(null)); // null
}
}В этом примере показаны основные операции с null-ключом: добавление, перезапись, получение и удаление. Важно помнить, что поведение с null-ключами может отличаться в других реализациях Map, таких как ConcurrentHashMap (где null-ключи запрещены) или TreeMap (где null-ключи могут вызывать NullPointerException).
Вывод: Использование null в качестве ключа в HashMap допустимо, но следует применять эту возможность осознанно, учитывая, что только одна запись с null-ключом может существовать, и это может усложнить логику приложения, если null используется как специальное значение. Рекомендуется использовать null-ключи только в случаях, когда это действительно необходимо для бизнес-логики, и избегать их в многопоточных средах, где ConcurrentHashMap является более подходящим выбором.