Некоторые примеры 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
Рекомендации
- Википедия: Хэш-код Java()
- 3 вещи, которые вы должны знать о хэш-коде()
- JDK 7 Объекты JavaDoc
- Общий язык Apache Lang
- JAVADOC для создания хэш-кода
- Стековый поток: Переопределение equals и хэш-кода в Java?
Оригинал: “https://mkyong.com/java/java-how-to-overrides-equals-and-hashcode/”