Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

Object.equals()

Сравнивает объекты по смыслу. По умолчанию работает как ==, поэтому в своих классах его переопределяют.

Доступно с: Java 1.0

Синтаксис

public boolean equals(Object obj)

Параметры

ПараметрТипОписание
objObjectОбъект для сравнения, может быть null.

Возвращаемое значение

booleantrue, если объекты считаются равными.

Примеры

Без переопределения два одинаковых объекта не равны:

class Book {
    String title;
    Book(String title) { this.title = title; }
}
 
void main() {
    IO.println(new Book("Dune").equals(new Book("Dune")));
}

Результат:

false

Переопределение equals() вместе с hashCode():

class Book {
    final String title;
    final int year;
 
    Book(String title, int year) {
        this.title = title;
        this.year = year;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Book other)) return false;
        return year == other.year && title.equals(other.title);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(title, year);
    }
}
 
void main() {
    var a = new Book("Dune", 1965);
    var b = new Book("Dune", 1965);
    IO.println(a.equals(b));
    IO.println(new HashSet<>(List.of(a, b)).size());
}

Результат:

true
1

Примечания

Правило: переопределили equals() — переопределите и hashCode(), иначе HashSet и HashMap будут считать равные объекты разными. Параметр метода — Object, а не ваш класс: equals(Book other) — это перегрузка, а не переопределение, и коллекции её не вызовут. Аннотация @Override поймает эту ошибку.

Записи (record) получают правильные equals() и hashCode() автоматически.

См. также

  • Object.hashCode() — Возвращает хеш-код объекта — число, по которому HashMap и HashSet быстро находят объект.
  • Objects.equals() — Сравнивает два объекта через equals(), безопасно для null.
  • == vs equals() — == сравнивает значения примитивов и ссылки объектов; содержимое объектов сравнивает equals().
  • record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().

Вопросы и ответы по теме

В учебнике

  • Методы класса Object — Методы toString, equals и hashCode в Java: как их переопределять и почему equals и hashCode всегда меняют вместе.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.