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; }
注意:本文来自网友投稿。本站无法对本文内容的真实性、完整性、及时性、原创性提供任何保证,请您自行验证核实并承担相关的风险与后果!
CoLaBug.com遵循[CC BY-SA 4.0]分享并保持客观立场,本站不承担此类作品侵权行为的直接责任及连带责任。您有版权、意见、投诉等问题,请通过[eMail]联系我们处理,如需商业授权请联系原作者/原网站。