Что происходит при вызове equals() на null-ссылке в Java?

«Что происходит при вызове equals() на null-ссылке в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Вызов любого метода на null-ссылке вызывает NullPointerException.

Пример:

String str = null;
boolean result = str.equals("hello");  // NullPointerException!

Безопасные подходы для сравнения:

  1. Вызов equals() на литерале или заведомо не-null объекте

    String str = null;
    boolean result = "hello".equals(str);  // false, без исключения
  2. Использование Objects.equals() (Java 7+)

    import java.util.Objects;
    
    String str1 = null;
    String str2 = "hello";
    
    boolean result1 = Objects.equals(str1, str2);  // false
    boolean result2 = Objects.equals(null, null);  // true
  3. Явная проверка на null

    public boolean safeEquals(String a, String b) {
       if (a == null) {
           return b == null;  // оба null → true, иначе false
       }
       return a.equals(b);  // a не null, можно безопасно вызывать equals
    }

Реализация Objects.equals():

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

Особенности для собственных классов:

public class Person {
    private String name;

    @Override
    public boolean equals(Object o) {
        // 1. Проверка ссылки
        if (this == o) return true;

        // 2. Проверка null и класса
        if (o == null || getClass() != o.getClass()) return false;

        // 3. Сравнение полей
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

Важно: Всегда переопределяйте hashCode() вместе с equals() для корректной работы с коллекциями.