[ Java ] 重写 equals 方法,实现比较两个对象值是否相等

equals

== 用于比较值的引用地址是否一致,而 equals 用于比较值的内容是否一致,下面我们来比较一下这两个值是否相同

String x = "Hello";
String y = "Hello";
System.out.println(x.equals(y)); // true

可以发现它的值是相同的

下面我们来对两个对象的值进行比较

public class Main {
    public static void main(String[] args) {
        A x = new A("John", 20);
        A y = new A("John", 20);

        System.out.println(x == y); // false
        System.out.println(x.equals(y)); // false
    }
}

可以发现值的内容确实相同,但比较的结果是 false

其实在 object 中的 equals 底层使用的还是 == 进行比较的,所以他比较的还是值的引用地址并非值本身

下面是它的底层源码

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

为什么 Stringequals 就可以比较值呢?大家可以看看它的底层

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        return (anObject instanceof String aString)
                && (!COMPACT_STRINGS || this.coder == aString.coder)
                && StringLatin1.equals(value, aString.value);
    }

可以发现它的底层并非使用 == 进行比较,而是比较值是否相等。

这也就是为什么 Object 中的 equals 无法比较值的内容是否相等而 String 却可以的原因

那如果非要实现对象的 equals 方法支持比较值的内容是否一致,那么可以在对应的类(A类)中重写这个方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        A a = (A) o;
        return age == a.age && Objects.equals(name, a.name);
    }
public class Main {
    public static void main(String[] args) {
        A x = new A("John", 20);
        A y = new A("John", 20);

        System.out.println(x == y); // false
        System.out.println(x.equals(y)); // true
    }
}

这样就完美实现了比较两个对象内容是否一致的功能

评论区
头像