В Java сравнение объектов происходит с использованием методов equals() и hashCode().
Метод equals() Метод equals() используется для сравнения содержимого двух объектов на равенство. По умолчанию, метод equals() в классе Object сравнивает ссылки на объекты, то есть проверяет, являются ли две ссылки указателями на один и тот же объект в памяти. Однако, в большинстве случаев, требуется сравнивать объекты на основе их содержимого, а не ссылок.
Чтобы сравнивать объекты на основе их содержимого, необходимо переопределить метод equals() в соответствующем классе. При переопределении метода equals(), следует учитывать следующие правила:
- Метод equals() должен быть рефлексивным: x.equals(x) должен возвращать true.
- Метод equals() должен быть симметричным: если x.equals(y) возвращает true, то и y.equals(x) должен возвращать true.
- Метод equals() должен быть транзитивным: если x.equals(y) и y.equals(z) возвращают true, то и x.equals(z) должен возвращать true.
- Метод equals() должен быть консистентным: повторные вызовы x.equals(y) должны возвращать один и тот же результат, при условии, что никакая информация, используемая в сравнении, не была изменена.
- Метод equals() должен возвращать false, если аргумент null.
- Метод equals() должен возвращать false, если типы объектов несовместимы для сравнения.
Метод hashCode()
- Метод hashCode() используется для вычисления числового значения (хеш-кода) объекта. Хеш-код представляет собой целое число, которое обычно используется для оптимизации процесса поиска и сравнения объектов. Хеш-коды объектов, которые равны согласно методу equals(), должны быть одинаковыми.
Правила для переопределения метода hashCode():
- Если два объекта равны согласно методу equals(), то их хеш-коды должны быть равными.
- Переопределенный метод hashCode() должен быть согласован с методом equals(). Это означает, что если x.equals(y) возвращает true, то хеш-коды x и y должны быть равными.
- Переопределенный метод hashCode() не обязан возвращать уникальные значения для разных объектов. Однако, хорошей практикой является стремиться к минимизации коллизий хеш-кодов для разных объектов.
Важно отметить, что при переопределении метода equals(), также необходимо переопределить метод hashCode(), чтобы соблюсти правила согласованности между этими двумя методами.
Пример переопределения методов equals() и hashCode():
public class MyClass {
private int id;
private String name;
// Конструкторы, геттеры и сеттеры
@Override public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
MyClass myClass = (MyClass) obj;
return id == myClass.id && Objects.equals(name, myClass.name);
}
@Override public int hashCode() {
return Objects.hash(id, name);
}
}
В этом примере метод equals() сравнивает значения полей id и name двух объектов класса MyClass. Метод hashCode() вычисляет хеш-код на основе этих полей с использованием метода Objects.hash().
Если вам понравилось, буду признателен за подписку.