Java - Как переопределить equals и hashCode
Некоторые примеры Java, чтобы показать вам, как переопределитьequals
иhashCode
.
1. POJO
Чтобы сравнить два объекта Java, нам нужно переопределить какequals
, так иhashCode
(Хорошая практика).
User.java
public class User { private String name; private int age; private String passport; //getters and setters, constructor }
User user1 = new User("example", 35, "111222333"); User user2 = new User("example", 35, "111222333"); System.out.println(user1.equals(user2)); // false
2. Классический способ
Идея хэш-кода 17 и 31 взята из классической книги по Java - Effective Java: item 9
User.java
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 и более поздних версий вы можете использовать новый классObjects
для генерации значений равенства и хэш-кода.
User.java
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 Commons Lang
В качестве альтернативы вы можете использовать функцию Apache Commons LangEqualsBuilder
иHashCodeBuilder
.
User.java
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. Проверить снова
После отменяет оба параметра:equals
иhashCode
.
User user1 = new User("example", 35, "111222333"); User user2 = new User("example", 35, "111222333"); System.out.println(user1.equals(user2)); // true