java——equals(),hashCode()重写与不重写区别

1,总结
(1)两个obj,如果equals()相等,hashCode()一定相等。
(2)两个obj,如果hashCode()相等,equals()不一定相等。
2,不重写equals(),hashCode()
不重写的时候,比较两个对象是否“相等“,默认跟”==“效果相同,直接比较两个对象的内存地址值。【此时,克隆出来的对象与原有对象有着不同的哈希值(毕竟是克隆出来的,是两个对象)】
3,重写equals(),hashCode()。
按快捷键重写的这两个方法的时候是这样的
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;

    Student student = (Student) o;

    if (age != student.age) return false;
    if (!name.equals(student.name)) return false;
    if (!gender.equals(student.gender)) return false;
    return school.equals(student.school);
}

@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + gender.hashCode();
    result = 31 * result + age;
    result = 31 * result + school.hashCode();
    return result;
}

此时,重写了equals(),hashCode()。哈希值是根据成员变量得来的,如果成员变量一致,则无论时新new出来的两个对象,还是克隆出来的对象跟原对象的哈希值都是一致的。
如果改变某个对象的某个成员变量,该对象的哈希值都会发生相应的改变。
++++++++++++++++++++++++例子++++++++++++++++++++++++++++++++
public class Student implements Cloneable{
private String name;
private String gender;
private int age;
private String school;

public Student() {
}

public Student(String name, String gender, int age, String school) {
    this.name = name;
    this.gender = gender;
    this.age = age;
    this.school = school;
}

@Override
public String toString() {
    return "Student{" +
            "name='" + name + '\'' +
            ", gender='" + gender + '\'' +
            ", age=" + age +
            ", school='" + school + '\'' +
            '}';
}

@Override
protected Object clone() throws CloneNotSupportedException {
    return super.clone();
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getGender() {
    return gender;
}

public void setGender(String gender) {
    this.gender = gender;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getSchool() {
    return school;
}

public void setSchool(String school) {
    this.school = school;
}

/**
 * 这个方法是自己手动重写的equals(),其实可以按快捷键同事重写
 * equals()hashCode(),这两个方法有必要同时重写,已维护hashCOde
 * 方法的常规协定,该协定声明相等对象必须有相等的哈希值
 * @param obj
 * @return
 */

// @Override
// public boolean equals(Object obj) {
// /*
// * 需要在equals()方法中提供自己的判断标准
// * 常常拿成员变量是否相等来处理
// * */
//
//// return super.equals(obj);
//
// if(this==obj){
// return true;
// }
// //成员变量对比
// //向下类型转换
//
//// Student stu=(Student) obj;
// //又因为,ClassException,当向下类型转换时,有可能类型不一样,
// // 所以可以使用instanceof(一个运算符)判断当前对象是否是某一个类型的实例
// if(obj instanceof Student){
// Student stu=(Student) obj;
// if(this.age!=stu.age){
// return false;
// }
// if(!this.name.equals(name)){
// //这里的equals是String类型的equals
// return false;
// }
// if(!this.gender.equals(stu.gender)){
// return false;
// }
// if(!this.school.equals(stu.school)){
// return false;
// }
// return true;
// }
//
//
// return false;
// }

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Student)) return false;

    Student student = (Student) o;

    if (age != student.age) return false;
    if (!name.equals(student.name)) return false;
    if (!gender.equals(student.gender)) return false;
    return school.equals(student.school);
}

@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + gender.hashCode();
    result = 31 * result + age;
    result = 31 * result + school.hashCode();
    return result;
}

}
++++++++++++++++++++++++++++++++++++++++++++++
public class StudentDemo {
public static void main(String[] args){
Student stu1=new Student(“jerry”,“男”,20,“轻工业”);
Student stu2=new Student(“jerry”,“男”,20,“轻工业”);
System.out.println(“stu1”+stu1);
System.out.println(“stu2”+stu2);
System.out.println(“stu1#hashCode”+stu1.hashCode());
System.out.println(“stu2#hashCode”+stu2.hashCode());
System.out.println(“clone===”);
try {
Student stu3=(Student) stu1.clone();
System.out.println(“stu1”+stu1);
System.out.println(“stu3”+stu3);
System.out.println(“stu1#hashCode”+stu1.hashCode());
System.out.println(“stu3#hashCode”+stu3.hashCode());
//改变克隆出来的对象的某个成员变量,再看效果
System.out.println(“clone改变后===”);
stu3.setName(“jerrp”);
System.out.println(“stu1”+stu1);
System.out.println(“stu3”+stu3);
System.out.println(“stu1#hashCode”+stu1.hashCode());
System.out.println(“stu3#hashCode”+stu3.hashCode());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

猜你喜欢

转载自blog.csdn.net/weixin_42981168/article/details/88093628