Некоторые примеры 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/”