欢迎您的访问
专注于分享最有价值的互联网技术干货

如何正确的重写equals() 和 hashCode()方法

几个T的资料等你来白嫖
双倍快乐
一点要收藏这个宝藏网站防止丢失,资源帮找!!!

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

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  

下面我们将介绍几种常用方法:

1.经典方式

这种17和31散列码的想法来自经典的Java书籍——《Effective 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

对于JDK7及更新版本,你可以是使用 java.util.Objects 来重写 equals 和 hashCode 方法,代码如下

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 Lang EqualsBuilderHashCodeBuilder 方法。代码如下

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();  
    }  
}  

最后测试总结:

在使用上述三种任何一种方式都可以到如下结果:

User user1 = new User("mkyong", 35, "111222333");  
User user2 = new User("mkyong", 35, "111222333");  
System.out.println(user1.equals(user2)); // true 

其实后两种都是对于17和31散列码思想的封装实现。具体请参考《Effective Java》第九条。

赞(0) 打赏
版权归原创作者所有,任何形式转载请联系我们:大白菜博客 » 如何正确的重写equals() 和 hashCode()方法

评论 抢沙发

2 + 9 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏