equals和hashCode

equals和hashCode

equals()

为什么重写equals()方法

基本数据类型用 == 比较数值是否相等

引用数据类型用 == 比较的是内存中的地址,所以引用数据类型建议用 equals() 比较内容,

但是如果引用数据类型内部不重写Object的 equals() 方法,调用equals时会默认用Object的这个方法

 public boolean equals(Object obj) {
        return (this == obj);//说白了用Object的equals方法还是比地址,比重写和用“==”没区别
   }

所以需要重写equals方法

equals方法重写实现

//以Student类为例,有name,age,gender属性,重写规范如下
@Override
public boolean equals(Object obj){
    if(obj==null)//为什么判空,加入不判空,obj是空走到11行调用t2调用属性报空指针异常
        return false;
    if(this==obj)//为什么加这个,两个对象如果内存地址相同,那么一定是同一个对象,属性相同,这里是为了提高效率
        return true;
    if(obj instanceof Teacher){//为什么写这个,假设传入的obj是Teacher类(和Student类毫无关系),没有这一行,下面第10行的强转就会报“类转换异常”
        Teacher t1=this;
        Teacher t2=(Teacher)obj;
        if(t1.name.equals(t2.name) && t1.age==t2.age && t1.gender==t2.gender)
            return true;
    }
    return false;
}

hashCode()

为什么重写hashCode()

java官方建议”当此方法[equals]被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码

如果两个引用类型相等,那么hashCode的值也一定相等,重写equals能比较两个对象是否相等,那么也需要重写hashCode()方法,否则它会调用当使用hash值的时候,会调用Object的hashCode()方法,那这两个对象的值会不同

 public native int hashCode();

如何重写hashCode()

@Override
public int hashCode(){
    int result=name.hashCode();
    result=result*31+age;//用31是使用31后重码率最低
    result=result*31+gender;
    return result;
}