equals和hashCode

equals和hashCode

目录

      • 为什么重写equals()方法

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;
}
博客园精华区
我还没有学会写个人说明!
上一篇

迪士尼动画电影《寻龙传说》国内定档 赵丽颖为女主配音

下一篇

使用jemalloc优化Mysql、PHP内存占用

你也可能喜欢

评论已经被关闭。

插入图片