Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
03 Фев 2024
2 мин
804

Переопределение методов equals и hashCode в Java

Часто возникают ситуации, когда требуется сравнивать объекты не по ссылке, а по содержимому. Например, имеется класс Book, который содержит поля author,

Часто возникают ситуации, когда требуется сравнивать объекты не по ссылке, а по содержимому. Например, имеется класс Book, который содержит поля author, title и year. Если потребуется сравнить две книги не по ссылке, а по автору, названию и году издания, то необходимо переопределить метод equals.

class Book {
    String author;
    String title;
    int year;

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Book book = (Book) obj;
        return year == book.year &&
                Objects.equals(author, book.author) &&
                Objects.equals(title, book.title);
    }
}

Однако, при переопределении метода equals, необходимо также переопределить и метод hashCode, чтобы поддерживать общий контракт между ними. Если два объекта считаются равными по методу equals, то их хеш-коды также должны быть равными.

    @Override
    public int hashCode() {
        return Objects.hash(author, title, year);
    }

При переопределении этих методов следует учесть несколько важных моментов:

  1. Симметричность: Если один объект равен другому, то и второй объект должен быть равен первому. Это обеспечивается правильной реализацией метода equals.

  2. Транзитивность: Если первый объект равен второму, и второй объект равен третьему, то первый объект должен быть равен третьему. Это также обеспечивается корректной реализацией метода equals.

  3. Консистентность: Если информация, используемая в методах equals и hashCode, не изменяется, то многократные вызовы этих методов должны возвращать одинаковые результаты.

  4. Не равенство к null: Объект должен быть не равен null. Метод equals должен возвращать false, если его параметр null.

  5. Соответствие между equals и hashCode: Если два объекта равны по методу equals, то и их хеш-коды должны быть равны.

Следуя этим принципам, можно избежать многих проблем при работе с коллекциями и другими структурами данных, которые полагаются на методы equals и hashCode.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий