如何正確的重寫equals() 和 hashCode()方法
阿新 • • 發佈:2018-01-26
來看 oar gpo ati sdn copy sys == -m
其實後兩種都是對於17和31散列碼思想的封裝實現。具體請參考《Effective Java》第九條。
比較兩個Java對象時, 我們需要覆蓋equals和 hashCode。
[java] view plain copy- public class User{
- private String name;
- private int age;
- private String passport;
- //getters and setters, constructor
- }
在比較結果時:
[java] view plain copy- User user1 = new User("mkyong", 35, "111222333");
- User user2 = new User("mkyong", 35, "111222333");
- System.out.println(user1.equals(user2)); // false
下面我們將介紹幾種常用方法:
1.經典方式
這種17和31散列碼的想法來自經典的Java書籍——《Effective Java》第九條。下面我們來看看是如何實現的... [java] view plain copy- 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
對於JDK7及更新版本,你可以是使用java.util.Objects
來重寫 equals 和 hashCode 方法,代碼如下
[java] view plain copy
- 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
方法。代碼如下
[java] view plain copy
- 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();
- }
- }
最後測試總結:
在使用上述三種任何一種方式都可以到如下結果: [java] view plain copy- User user1 = new User("mkyong", 35, "111222333");
- User user2 = new User("mkyong", 35, "111222333");
- System.out.println(user1.equals(user2)); // true</span>
其實後兩種都是對於17和31散列碼思想的封裝實現。具體請參考《Effective Java》第九條。
如何正確的重寫equals() 和 hashCode()方法