java之hashCode和equals
如何判断两个对象是否相等?
未重写的equals方法判断的是对象的地址
public boolean equals(Object obj) {
return (this == obj);//判断对象的地址
}
判断对象是否相等
- 如果是自定义的类new出来的两个对象肯定是不相等的,因为对象的地址不同
public class Main {
public static void main(String[] args) {
classOne classOne=new classOne();
classOne.setAge("1");
classOne.setName("张三");
classOne classTwo=new classOne();
classTwo.setAge("1");
classTwo.setName("张三");
System.out.println("classOne的hashCode:"+classOne.hashCode());
System.out.println("classTwo的hashCode:"+classTwo.hashCode());
System.out.println("classOne与classTwo是否相等"+classOne.equals(classTwo));
}
}
执行结果:
原因:虽然两个对象的属性值一致,但是因为未重写的equals判断的是对象的地址,两个对象的地址不同所以结果为false。
重写类的hashCode与equals方法,然后再判断
/**
* @Author: 薛定谔的英短
* @Date: 2020/12/7 9:27
*/
public class classOne {
private String age;
private String name;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "classOne{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int hashCode(){
int result = 17;
result = 31 * result + (name == null ? 0 : name.hashCode());
result = 31 * result + (age == null ? 0 : age.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(obj==null){
return false;
}
if(this == obj){
return true;//地址相等
}
if(obj instanceof classOne){
classOne classOne= (classOne)obj;
if(equalsStr(this.age,classOne.age)
&& equalsStr(this.name,classOne.name)){
return true;
}
}
return false;
}
//判断两个值是否相等
private boolean equalsStr(String str1, String str2){
if(str1 != null && str1.equals(str2)){
return true;
}
return false;
}
}
重写hashCode与equals方法后的执行结果:
ps:重写之后的equals判断的是同一个类的所有属性是否相等。
总结
- 如果两个对象的hashcode值不等,则必定是两个不同的对象。
- 如果要判断两个对象是否真正相等,必须通过equals方法。
- 如果调用equals方法得到的结果为true,则两个对象的hashcode值必定相等
- 如果要重写equals,则hashCode与equals必须都重写