equals相关用法总结

187 阅读3分钟

Object的equals(即未重写的equals)的实现:

在这里插入图片描述

public boolean equals(Object obj) {
        return this == obj;
        //Object的equals实现,对于非空引用this和obj,当且仅当他们引用同一个对象时,此方法才返回true,因为引用数据类型“==”比较的是地址,只有二者引用同一个对象,地址才会相同。
    }
boolean equals = x.equals(y){
		return x == y;
//对于任何非空引用值x和y,当且仅当x和y引用同一个对象时,此方法才
返回true值。

以上是直接比较对象的规则,如果直接比较两个对象的属性值,只要二者属性值相等,就会返回true

public class Student {
    String name;
    Integer gender;
    int age;
}
class Teacher {
    String name;
    Integer gender;
    int age;
 }

package equals;

public class Test {
    public static void main(String[] args) {
        Student s = new Student("小明",0,20);
        Student s1 = new Student("小明",0,20);
        boolean equals = s.equals(s);
        System.out.println(equals);//返回值为true;
        boolean equals1 = s.equals(s1);
        System.out.println(equals);//返回值为false;
         boolean equals2 = s.name.equals(s1.name);
        System.out.println(equals);//返回值为true;
         boolean equals3 = s.gender.equals(s1gender);
        System.out.println(equals);//返回值为true;
        //注:equals只能比较引用数据类型,不能比较基本数据类型,否则会报错!
        基本数据类型直接用“==”进行比较。
        boolean equals4 = s.age.equals(s1.age);
        System.out.println(equals);//age是基本数据类型,故报错;
    }  
}

对于重写的equals的实现: 为什么要重写:我们可以自定义比较两个对象相等的条件

//在类Student中对equals进行重写
public boolean equals(Object obj) {
//首先有一个判断的标志,将其初始值定义为false
        boolean flag = false;
 //然后判断传过来的对象是否是与比较对象的类相同,如果相同,将其
 父类引用转回子类引用,如果不同则无比较的意义
       if (obj instanceof Student) {
           Student stu = (Student) obj;
            if (this.age == stu.age && this.gender.equals
            (stu.gender) && this.name != null && stu.name !=
             null && this.name.equals(stu.name)) {
                flag = true;
            }
        }
        return flag;
    }
 public static void main(String[] args) {
        Student s3 = new Student("小明",0,20);
        Student s4 = new Student("小明",0,20);
        Teacher t = new Teacher("小明",0,20);
        boolean equals = s3.equals(s4);
        boolean b = t.equals(s3);
        System.out.println(equals);//true
        System.out.println(b);false

不同类的对象也可以用equals 未重写的equals直接报false,因为两个引用指向的并不是同一个对象。 对于重写的equals完全可以比较不同类的对象,只需修改instanceof。

public boolean equals(Object obj) {
        boolean flag = false;/
        //首先有一个判断的标志,将其初始值定义为false
        //然后判断传过来的对象是否是与比较对象的类相同,如果相同
        ,将其父类引用转回子类引用
       if (obj instanceof Teacher) {
          Teacher stu = (Teacher) obj;
            if (this.age == stu.age && this.gender.equals
            (stu.gender) && this.name != null && stu.name != 
            null && this.name.equals(stu.name)) {
                flag = true;
            }
        }
        return flag;
    }
 public static void main(String[] args) {
        Student s3 = new Student("小明",0,20);
        Student s4 = new Student("小明",0,20);
        Teacher t = new Teacher("小明",0,20);
        boolean equals = s3.equals(s4);
        boolean b = s3.equals(t);
        System.out.println(equals);//false
        System.out.println(b);//true
    }

注意:如果重写了equals,务必要重写hashcode,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

总结以下两种重写hashcode方法。

public class Student {
    String name;
    Integer gender;
    int age;

//方法一
public int hashCode() {
        int result = 18;
        result = 35 * result + name.hashCode();//字符串类型格式
        result = 35 * result + age;
        result = 35 * result + gender();
        return result;
    }
//方法二
 public int hashCode() {
        return Objects.hash(name, age, gender);
    }

新手总结,如有错误,欢迎指正。