Рубрики
Без рубрики

Java – Как переопределить equals и хэш-код

– Java – Как переопределить equals и хэш-код

Некоторые примеры Java, чтобы показать вам, как переопределить равно и Хэш-код .

1. ПОЖО

Чтобы сравнить два объекта Java, нам нужно переопределить оба равно и Хэш-код (Хорошая практика).

public class User {
    private String name;
    private int age;
    private String passport;

	//getters and setters, constructor
}
	User user1 = new User("mkyong", 35, "111222333");
    User user2 = new User("mkyong", 35, "111222333");

    System.out.println(user1.equals(user2)); // false

2. Классический Способ

Идея хэш-кода 17 и 31 взята из классической книги Java – эффективная Java: пункт 9

public class User {
    private String name;
    private int age;
    private String passport;

	//getters and setters, constructor

    @Override
    public boolean equals(Object o) {

        if (o == this) return true;
        if (!(o instanceof User)) {
            return false;
        }

        User user = (User) o;

        return user.name.equals(name) &&
                user.age == age &&
                user.passport.equals(passport);
    }

    //Idea from effective Java : Item 9
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        result = 31 * result + passport.hashCode();
        return result;
    }

}

2. JDK 7

Для JDK 7 и выше вы можете использовать новый класс объекта для генерации значений equals и хэш-кода.

import java.util.Objects;

public class User {
    private String name;
    private int age;
    private String passport;

	//getters and setters, constructor

    @Override
    public boolean equals(Object o) {

        if (o == this) return true;
        if (!(o instanceof User)) {
            return false;
        }
        User user = (User) o;
        return age == user.age &&
                Objects.equals(name, user.name) &&
                Objects.equals(passport, user.passport);
    }

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

}

3. Общий язык Apache Lang

В качестве альтернативы вы можете использовать язык Apache Commons Lang Эквалсбилдер и HashCodeBuilder функция.

import org.apache.commons.lang3.builder;

public class User {
    private String name;
    private int age;
    private String passport;

	//getters and setters, constructor

     @Override
    public boolean equals(Object o) {

        if (o == this) return true;
        if (!(o instanceof User)) {
            return false;
        }

        User user = (User) o;

        return new EqualsBuilder()
                .append(age, user.age)
                .append(name, user.name)
                .append(passport, user.passport)
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 37)
                .append(name)
                .append(age)
                .append(passport)
                .toHashCode();
    }

}

4. Проверьте еще раз

После переопределяет оба равно и Хэш-код .

	User user1 = new User("mkyong", 35, "111222333");
    User user2 = new User("mkyong", 35, "111222333");

    System.out.println(user1.equals(user2)); // true

Рекомендации

  1. Википедия: Хэш-код Java()
  2. 3 вещи, которые вы должны знать о хэш-коде()
  3. JDK 7 Объекты JavaDoc
  4. Общий язык Apache Lang
  5. JAVADOC для создания хэш-кода
  6. Стековый поток: Переопределение equals и хэш-кода в Java?

Оригинал: “https://mkyong.com/java/java-how-to-overrides-equals-and-hashcode/”