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