?!?!在Java中重写equals()方法?!?!

为什么要重写equals()方法?

因为继承Objec的equals方法只能判断两个对象是否是同一个对象。可是我们认为常用的equals方法应该具有逻辑判断功能,所以我们重写equals方法,可以按照我们所需的要求自定义。

Object中equals方法

Object中的equals方法用于检测一个对象是否等于另外一个对象. Object类中,判断两个对象是否引用同一个对象实现equals方法,源码如下:

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

实际处理中,若要比较两个对象是否相等,一般需要重写equals方法.

equals()与==的区别

  • ==比较基本数据类型,比较的是值
  • ==比较引用数据类型,比较的是地址
  • equals()本身也比较地址,因为在equals()方法中,直接return的就是 this == obj
  • 但是因为String类对equals()方法进行了重写,所以可以比较内容

代码

package Test1;

/**
 * 重写toString方法
 */
public class Person {
    private String name;//名字
    private String idCard;//身份证号

    public String getName() {
        return name;
    }

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

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public Person(String name, String idCard) {
        this.name = name;
        this.idCard = idCard;
    }

    public Person() {}

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {//先进行一个判断  当前对象 this 和 传进来的 obj 进行比较
            return true;
        }
        if (obj instanceof Person) { //比较当前对象是属于我们要比较的Person类型的 ,才可以进行强转
            Person p = (Person)obj;//强制类型转换
            //父类Object类中不含getName()方法,所以需要强转,转为子类对象
            if(this.getName().equals(p.getName()) && this.getIdCard().equals(p.getIdCard())) {
                return true;
            }
        } else {
            System.out.println("不要瞎传对象");
        }
        return false;
    }
    public static void main(String[] args) {
        // equals 方法
        // == 比较基本数据类型 比较的是值 比较引用数据类型 比较的是内存中的地址
        // equals方法本身也是比较的地址 因为equals方法中 直接return 的 就是  this == obj
        Person p1 = new Person();
        Person p2 = new Person();
        System.out.println(p1 == p2);
        //  对象中不含值,如果此句不注释,会报空指针异常
        //  System.out.println(p1.equals(p2));
        System.out.println("=========我是分隔符========");
        // 我们通过new关键字创建出来的对象 地址的都不一样的
        // 我们通过==比较两个对象 地址肯定是不一样的
        // 我们现实生活中会有一些这样的需求  比如 两个人名字 身份证号都相同
        // 这种情况 我们要使用equals来比较 输出为true
        Person p3 = new Person("赵四" , "41023459578");
        Person p4 = new Person("赵四" , "41023459578");
        System.out.println(p3.equals(p4));
        System.out.println("=========我是分隔符========");
        Person p5 = new Person("广坤" , "4101234");
        Person p6 = new Person("广坤" , "41022356");
        System.out.println(p5.equals(p6));
    }
}

输出结果为:
?!?!在Java中重写equals()方法?!?!_第1张图片

java规范中对equals方法的约束

java规范中equals方法特征

自反性 对于任何非空引用x, x.equals(x) 返回true;
对称性 对于任何引用x, y, 当且仅当y.equals(x) 返回true, x.equals(y)返回true;
传递性 对于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 则 x.equals(z)返回true;
一致性 若x和y引用的对象没有发生改变, 则反复调用x.equals(y)应该返回同样的结果.
  • 对任意非空引用x, x.equals(null) 返回false;

你可能感兴趣的:(JavaSE)