使用 .equals() 和 == 运算符比较两个对象

2022-08-31 11:29:27

我构建了一个具有一个字段的类。然后我创建了两个对象,我必须使用运算符和也比较它们。以下是我所做的:String==.equals()

public class MyClass {

    String a;

    public MyClass(String ab) {
        a = ab;
    }

    public boolean equals(Object object2) {
        if(a == object2) { 
            return true;
        }
        else return false;
    }

    public boolean equals2(Object object2) {
        if(a.equals(object2)) {
            return true;
        }
        else return false;
    }



    public static void main(String[] args) {

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        object1.equals(object2);
        System.out.println(object1.equals(object2));

        object1.equals2(object2);
        System.out.println(object1.equals2(object2));
    }


}

编译后,结果显示两次假。如果两个对象具有相同的字段 - “test”,为什么它是错误的?


答案 1

==比较对象引用,它检查两个操作数是否指向同一对象(不是等效对象,而是同一对象)。

如果要比较字符串(以查看它们是否包含相同的字符),则需要使用 来比较字符串。equals

在你的例子中,如果字符串匹配,则认为两个实例 real 是相等的,则:MyClass

public boolean equals(Object object2) {
    return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}

...但通常,如果您正在定义一个类,则等效性比单个字段的等效性更多(在本例中)。a


旁注:如果覆盖 ,则几乎总是需要覆盖哈希码。正如它在 equals JavaDoc 中所说的那样:equals

请注意,每当重写此方法时,通常需要重写该方法,以便维护该方法的一般协定,该协定规定相等的对象必须具有相等的哈希代码。hashCodehashCode


答案 2

您应该覆盖等于

 public boolean equals (Object obj) {
     if (this==obj) return true;
     if (this == null) return false;
     if (this.getClass() != obj.getClass()) return false;
     // Class name is Employ & have lastname
     Employe emp = (Employee) obj ;
     return this.lastname.equals(emp.getlastname());
 }