📜  Java中的可选 equals() 方法和示例(1)

📅  最后修改于: 2023-12-03 15:16:31.786000             🧑  作者: Mango

Java中的可选equals()方法和示例

在Java中,对象之间的比较是通过equals()方法完成的。在默认情况下,equals()方法会比较两个对象的引用是否相等。然而,在某些情况下,程序员希望比较两个对象的内容是否相等。为了实现这个目标,Java允许程序员覆盖equals()方法。

覆盖equals()方法

要覆盖equals()方法,必须遵循一些规则:

  • equals()方法必须是public,以便其他类可以使用它。
  • equals()方法必须接受一个Object类型的参数。
  • equals()方法必须在Object类型范围内定义,否则子类无法覆盖它。
  • equals()方法必须实现对称性。如果a.equals(b)为true,则b.equals(a)也必须为true。
  • equals()方法必须实现传递性。如果a.equals(b)为true,并且b.equals(c)为true,则a.equals(c)也必须为true。
  • equals()方法必须实现一致性。如果两个对象在equals()方法中比较相等,则它们在每次比较中都必须相等,直到它们被修改。
  • equals()方法必须不能处理null值。如果传递给equals()方法的参数是null,则它必须返回false。
    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;  
        if (!(obj instanceof MyClass)) {  
            return false;  
        }  
        MyClass other = (MyClass) obj;  
        return other.getName().equals(this.name) &&  
                other.getValue() == this.value;  
    }
示例

下面展示一个覆盖equals()方法的示例。假设我们有一个名为MyClass的类,在该类中,我们定义了两个变量:name和value。我们希望比较两个MyClass对象的name和value是否相等。

public class MyClass {
    private String name;
    private int value;

    public MyClass(String name, int value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (!(obj instanceof MyClass)) {
            return false;
        }
        MyClass other = (MyClass) obj;
        return other.getName().equals(this.name) &&
                other.getValue() == this.value;
    }

    public static void main(String[] args) {
        MyClass obj1 = new MyClass("John", 10);
        MyClass obj2 = new MyClass("John", 10);
        MyClass obj3 = new MyClass("Mary", 20);

        // 比较两个MyClass对象
        System.out.println(obj1.equals(obj2)); // true
        System.out.println(obj1.equals(obj3)); // false
    }
}

上面的代码中,我们使用MyClass的构造函数创建了三个对象:obj1、obj2和obj3。然后我们调用obj1的equals()方法来比较obj1和obj2,结果为true,因为它们的name和value相等。然后我们调用obj1的equals()方法来比较obj1和obj3,结果为false,因为它们的name或value不相等。

结论

在Java中,equals()方法是一种比较两个对象是否相等的方法。如果我们希望比较两个对象的内容而不是引用,我们可以覆盖equals()方法。当覆盖equals()方法时,我们必须遵循一些规则,如对称性、传递性和一致性。