Вернёт ли метод equals true для двух Map, содержащих одинаковые ключи с null-значениями?

Ответ

Да, вернёт true. Контракт метода Map.equals() требует сравнения наборов записей (key-value pairs). Запись с null-значением считается валидной и участвует в сравнении.

Пример:

Map<String, String> map1 = new HashMap<>();
map1.put("keyA", null);

Map<String, String> map2 = new HashMap<>();
map2.put("keyA", null);

System.out.println(map1.equals(map2)); // Вывод: true

Как работает сравнение:

  1. Сравниваются наборы ключей (keySet). Если они не равны, метод возвращает false.
  2. Для каждого ключа из первого набора проверяется равенство значений с помощью Objects.equals(value1, value2). Этот метод корректно обрабатывает null (возвращает true, если оба аргумента null).

Таким образом, null-значения корректно сравниваются между собой.

Ответ 18+ 🔞

Ну ты глянь, какой вопрос подкинули! Про null в мапе и equals. Да я тебе щас так разложу, что ты офигеешь, как от хорошего анекдота.

Так, слушай сюда, не перебивай. Вот есть у тебя два HashMap, как два брата-близнеца, оба лысых и с татухой «не забуду мать родную». В каждый ты суёшь по ключу "keyA", а в качестве значения — чистейший, первозданный null. Не строка "null", а именно него, пустоту, ничто, дыру в реальности.

И вот ты вызываешь map1.equals(map2). А в документации, эта священная корова Java, чёрным по белому прописано: сравниваются не просто ключи, а вся запись, целиком — ключ и значение. И null — это не какой-то изгой, это полноправный гражданин в мире значений! Он имеет право на сравнение!

И сравнивает их не абы как, а через Objects.equals(value1, value2). А эта хитрая жопа, прости господи, функция сделана умно: если оба аргумента — null, она пожимает плечами и говорит «ну, окей, пиздец, но они равны». Возвращает true.

Так что твой код:

Map<String, String> map1 = new HashMap<>();
map1.put("keyA", null);

Map<String, String> map2 = new HashMap<>();
map2.put("keyA", null);

System.out.println(map1.equals(map2)); // Вывод: true

Выдаст тебе true. Потому что оба ключа одинаковые, и оба значения — это одно и то же великое ничто. Две пустоты оказались идентичными, вот такой ёперный театр.

Короче, запомни: Map.equals() сравнивает пары. А null — это законное значение для пары. Всё, вопрос закрыт, можно идти пить чай. Или что ты там обычно пьёшь.