您好,欢迎来到易妖游戏网。
搜索
您的当前位置:首页为什么要同时重写equals方法和hashCode方法(详解)

为什么要同时重写equals方法和hashCode方法(详解)

来源:易妖游戏网

在解释为什么要重写equals方法和hashcode方法时,我们要先了解一下这样重写的目的是什么,也让自己有一个思路,围绕这个思路去思考问题,能更好的整握其中的缘由,针对这个目的去思考为什么要去重写,重写的作用是什么,以及如何去重写它们。

一、重写equals方法和hashcode方法的目的

二、为什么要同时重写equals方法和hashcode方法

了解目的之后,所以我们需要重写这俩个方法,那只重写其中的一个方法可行嘛?我们来分析一下:
只重写equals方法:这种方法是可行的,但是假如有这样一个情况,在做俩个对象A和B的比较时,B对象是存放在集合里的,且集合里的数据多达几万条,那我们还要调用equals方法来一个一个比较嘛,当然可以,但是这样的话,效率就必然成了一个问题,所以,这个时候,就需要我们的hashcode方法了。
只重写hashcode方法呢:在做对象之间的比较时,我们要知道:

  • 如果equals方法相等,则他们hsahcode的hash值必然相等,俩个对象必然相等
  • 如果equals方法不等,则他们hashcode的hash值不一定不等,俩个对象必然不等
  • 如果hashcode的hash值不等,则俩个对象必然不等
  • 如果hashcode的hash值相等,俩个对象不一定相等,要在判断equals是否相等来比较俩个对象是否相等。
    所以,需要同时重写equals方法和hashcode方法。

三、重写equals方法和hashcode方法的作用

其实,如果看懂了上文的话,这里也就知道了重写这俩个方法的作用,
第一点:就是为了更加高效的去比较俩个对象是否相等。
第二点:实现特殊的需求。

四、如何重写equals方法和hashcode方法

public class User {
private String id;
private String name;
private String age;

public User(){

}

public User(String id, String name, String age){
    this.id = id;
    this.name = name;
    this.age = age;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAge() {
    return age;
}

public void setAge(String age) {
    this.age = age;
}

@Override
public String toString() {
    return this.id + " " + this.name + " " + this.age;
}

@Override
public boolean equals(Object obj) {
    if(this == obj){
        return true;//地址相等
    }

    if(obj == null){
        return false;//非空性:对于任意非空引用x,x.equals(null)应该返回false。
    }

    if(obj instanceof User){
        User other = (User) obj;
        //需要比较的字段相等,则这两个对象相等
        if(equalsStr(this.name, other.name)
                && equalsStr(this.age, other.age)){
            return true;
        }
    }

    return false;
}

private boolean equalsStr(String str1, String str2){
    if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2)){
        return true;
    }
    if(!StringUtils.isEmpty(str1) && str1.equals(str2)){
        return true;
    }
    return false;
}

@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + (name == null ? 0 : name.hashCode());
    result = 31 * result + (age == null ? 0 : age.hashCode());
    return result;
}
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- vipyiyao.com 版权所有 湘ICP备2023022495号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务