zoukankan      html  css  js  c++  java
  • 如何正确的重写equals() 和 hashCode()方法

    比较两个Java对象时, 我们需要覆盖equals和  hashCode。

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

    在比较结果时:

    [java] view plain copy
     
    1. User user1 = new User("mkyong", 35, "111222333");  
    2. User user2 = new User("mkyong", 35, "111222333");  
    3.   
    4. 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.   
    3. public class User {  
    4.     private String name;  
    5.     private int age;  
    6.     private String passport;  
    7.   
    8.     //getters and setters, constructor  
    9.   
    10.     @Override  
    11.     public boolean equals(Object o) {  
    12.         if (o == this) return true;  
    13.         if (!(o instanceof User)) {  
    14.             return false;  
    15.         }  
    16.         User user = (User) o;  
    17.         return age == user.age &&  
    18.                 Objects.equals(name, user.name) &&  
    19.                 Objects.equals(passport, user.passport);  
    20.     }  
    21.   
    22.     @Override  
    23.     public int hashCode() {  
    24.         return Objects.hash(name, age, passport);  
    25.     }  
    26.   
    27. }  

    3.Apache Commons Lang

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

    最后测试总结:

    在使用上述三种任何一种方式都可以到如下结果:
    [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》第九条。
  • 相关阅读:
    C字符串处理函数
    C语言字符串函数大全
    那些闪亮的日子
    牛客网在线编程:幸运数
    牛客网在线编程:水仙花数
    [LeetCode]617.Merge Two Binary Trees
    [LeetCode]657.Judge Route Circle
    [LeetCode]141. Linked List Cycle
    五大算法:分治,贪心,动态规划,回溯,分支界定
    [LeetCode]387.First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/baizhanshi/p/8358142.html
Copyright © 2011-2022 走看看