java重写equals和hashcode方法分析
程序员文章站
2024-01-13 20:35:22
...
通常业务中我们定义两个对象,如果他们属性相同的话,就认为他们是相等的。
但是对象自带的等于方法,是用==比较的,比较的对象引用,但是不一定是一个对象地址,也有相同属性内容,业务需要让他俩等于相同,所以就需要重写equals了(如果不懂看这篇文章)
这是对象自带的等于方法,内部是==比较的对象引用。
public boolean equals(Object obj) {
return (this == obj);
}
下面重写equals方法演示
Animals
package MaEquals.RewriteEquals;
import java.util.Objects;
public class Animals {
private String name;
private String skill;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
/**
* 重写对象的equals方法,判等
*
* @param objk
* @return
*/
@Override
public boolean equals(Object objk) {
// 判断引用地址是否相等
if (this == objk) {
return true;
}
// 判断类型是否相同
if (objk.getClass() != Animals.class) {
return false;
}
// 判断引用不同的情况,属性是否相同
if (objk != null) {
// 类型相同看属性是否相同
Animals animal = (Animals) objk;
if (Objects.equals(animal.getName(), this.name) && Objects.equals(animal.getSkill(), this.skill)) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(name, skill);
}
}
测试代码
package MaEquals.RewriteEquals;
public class TestAnimals {
public static void main(String[] args) {
Animals tiger = new Animals();
Animals cat = new Animals();
System.out.println(tiger.hashCode()+"++++++"+cat.hashCode());
System.out.println(tiger.equals(cat));
}
}
结果
true
可以把代码重写的等于方法注释掉,然后测试发现输出错误。
但是重写后,得考虑一个正常问题:
hashcode不等,equals一定不相等.hashcode相等,equals可能相等,也可能不等。
但是为了Java的语言对equals的要求。所以hashcode需要重写保证相同。
然后重写hashcode
@Override
public int hashCode() {
return Objects.hash(name, skill);
}
测试
System.out.println(tiger.hashCode()+"++++++"+cat.hashCode());
结果
961 ++++++ 961
eclipse里面有快捷生成方式
在java文件里面右键---》source---》Generate hashCode and equals()... 注意生成的代码是否跟自已要实现的有差别没有。