Java中的equals和hashCode

目录

equals

hashCode

equals和hashCode之间的关系

总结

equals

equals方法是Object类中用于检测两个对象是否相同的方法,Object类中实现的是两个对象引用是否相同的方法,看以下Object类中代码:

    public boolean equals(Object obj) {
        return (this == obj);
    }

可以看出来,Object类中equals方法本质上比较的还是两个对象的引用是否相同。也就是比较一个对象是否等于另一个对象。

class Student {
    public int age;
    public String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }
}
public class test02 {
    public static void main(String[] args) {
        Student student1 = new Student(18, "张三");
        Student student2 = new Student(18, "张三");
        System.out.println(student1 == student2);  //false
        System.out.println(student1.equals(student2));  //false
    }
}

可以看出,上述代码中创建了两个对象,然后分别用“==”和equals进行比较。

得出的结果都是相同的false。

原因就是所有的类默认都继承与Object类,当我们调用equals方法的时候,当前类并没有equals方法的实现,所以就调用了Object类中的equals方法。

当时Object类中的equals方法本质上还是采用“==”进行比较的。

“==”比较的如果是引用类型的话,就是比较的两个引用之间的地址是否相同。

但是可以看出上述代码中两个对象的各个属性都是相同的。

此时我们就需要重写equals方法了。

class Student {
    public int age;
    public String name;

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
}
public class test02 {
    public static void main(String[] args) {
        Student student1 = new Student(18, "张三");
        Student student2 = new Student(18, "张三");
        System.out.println(student1 == student2);  //false
        System.out.println(student1.equals(student2));  //true
    }
}

 可以看出当我们重写了Object的equals方法之后,两个对象进行比较的时候,结果就是true,因为两个对象中的各个属性都是相同的。

hashCode

hashCode方法的返回值是一个数值,返回的是一个对象具体的位置。

class Student {
    public int age;
    public String name;

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}
public class test02 {
    public static void main(String[] args) {
        Student student1 = new Student(18, "张三");
        Student student2 = new Student(18, "张三");
        System.out.println(student1 == student2);  //false
        System.out.println(student1.equals(student2));  //true
        System.out.println(student1.hashCode());
        System.out.println(student2.hashCode());
    }
}

Java中的equals和hashCode_第1张图片 

 可以看出这两个对象的hashCode码值是一样的。但是并不代表两个对象就是相同的同一个对象

equals和hashCode之间的关系

当两个对象的hashCode不同时,equals一定不相同。

当两个对象的hashCode相同时,两个对象的equals一定是true,但是不一定是同一个对象。

一定要同时重写 equals() 和 hashCode() 吗?

不一定:如果对象作为键在哈希表中,那么两个方法都要重写,因为put和get的时候需要用到哈希码值和equals方法,如果对象不在哈希表中,仅仅是用来判断是否相等,那么就重写equals方法就行了。

总结

Java基础真的很重要,所谓基础不牢,地动山摇。加油

你可能感兴趣的:(Java基础,java,开发语言)