Object.equals()
Сравнивает объекты по смыслу. По умолчанию работает как ==, поэтому в своих классах его переопределяют.
Доступно с: Java 1.0
Синтаксис
public boolean equals(Object obj)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| obj | Object | Объект для сравнения, может быть 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 всегда меняют вместе.