1. 程式人生 > >如何正確的重寫equals() 和 hashCode()方法

如何正確的重寫equals() 和 hashCode()方法

來看 oar gpo ati sdn copy sys == -m

比較兩個Java對象時, 我們需要覆蓋equals和 hashCode。

[java] view plain copy
  1. public class User{
  2. private String name;
  3. private int age;
  4. private String passport;
  5. //getters and setters, constructor
  6. }

在比較結果時:

[java] view plain copy
  1. User user1 = new User("mkyong", 35, "111222333");
  2. User user2 = new User("mkyong", 35, "111222333");
  3. System.out.println(user1.equals(user2)); // false


下面我們將介紹幾種常用方法:

1.經典方式

這種17和31散列碼的想法來自經典的Java書籍——《Effective Java》第九條。下面我們來看看是如何實現的... [java] view plain copy
  1. public class User {
  2. private String name;
  3. private int age;
  4. private String passport;
  5. //getters and setters, constructor
  6. @Override
  7. public boolean equals(Object o) {
  8. if (o == this) return true;
  9. if (!(o instanceof User)) {
  10. return false;
  11. }
  12. User user = (User) o;
  13. return user.name.equals(name) &&
  14. user.age == age &&
  15. user.passport.equals(passport);
  16. }
  17. //Idea from effective Java : Item 9
  18. @Override
  19. public int hashCode() {
  20. int result = 17;
  21. result = 31 * result + name.hashCode();
  22. result = 31 * result + age;
  23. result = 31 * result + passport.hashCode();
  24. return result;
  25. }
  26. }

2.JDK 7

對於JDK7及更新版本,你可以是使用java.util.Objects 來重寫 equals 和 hashCode 方法,代碼如下 [java] view plain copy
  1. import java.util.Objects;
  2. public class User {
  3. private String name;
  4. private int age;
  5. private String passport;
  6. //getters and setters, constructor
  7. @Override
  8. public boolean equals(Object o) {
  9. if (o == this) return true;
  10. if (!(o instanceof User)) {
  11. return false;
  12. }
  13. User user = (User) o;
  14. return age == user.age &&
  15. Objects.equals(name, user.name) &&
  16. Objects.equals(passport, user.passport);
  17. }
  18. @Override
  19. public int hashCode() {
  20. return Objects.hash(name, age, passport);
  21. }
  22. }

3.Apache Commons Lang

或者,您可以使用Apache Commons LangEqualsBuilderHashCodeBuilder 方法。代碼如下 [java] view plain copy
  1. import org.apache.commons.lang3.builder;
  2. public class User {
  3. private String name;
  4. private int age;
  5. private String passport;
  6. //getters and setters, constructor
  7. @Override
  8. public boolean equals(Object o) {
  9. if (o == this) return true;
  10. if (!(o instanceof User)) {
  11. return false;
  12. }
  13. User user = (User) o;
  14. return new EqualsBuilder()
  15. .append(age, user.age)
  16. .append(name, user.name)
  17. .append(passport, user.passport)
  18. .isEquals();
  19. }
  20. @Override
  21. public int hashCode() {
  22. return new HashCodeBuilder(17, 37)
  23. .append(name)
  24. .append(age)
  25. .append(passport)
  26. .toHashCode();
  27. }
  28. }

最後測試總結:

在使用上述三種任何一種方式都可以到如下結果: [java] view plain copy
  1. User user1 = new User("mkyong", 35, "111222333");
  2. User user2 = new User("mkyong", 35, "111222333");
  3. System.out.println(user1.equals(user2)); // true</span>

其實後兩種都是對於17和31散列碼思想的封裝實現。具體請參考《Effective Java》第九條。

如何正確的重寫equals() 和 hashCode()方法