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

Fas*_*owy 73 java methods class equals object

我用一个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));
    }


}
Run Code Online (Sandbox Code Playgroud)

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

T.J*_*der 127

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

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

在您的情况下,如果MyClass字符串匹配,如果两个实例被认为是相等的,则:

public boolean equals(Object object2) {
    return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}
Run Code Online (Sandbox Code Playgroud)

...但通常如果你要定义一个类,那么等效性就等于单个字段的等效性(a在这种情况下).


旁注:如果覆盖equals,几乎总是需要覆盖hashCode.正如它在equalsJavaDoc中所说:

请注意,通常需要在重写此hashCode方法时覆盖该方法,以便维护该hashCode方法的常规协定,该协定声明相等的对象必须具有相等的哈希代码.


小智 16

你应该重写等于

 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());
   }
Run Code Online (Sandbox Code Playgroud)

  • 我认为`if(this == null)`的情况无论如何都是不必要的; 调用`nullObject.equals(whatever)`会抛出一个空指针异常,所以我们可以安全地假设`this`在我们编写的任何Java方法中都不是null. (7认同)
  • 这可以说是最好的答案,但是对于非原始类型,您可能希望使用this.equals(obj)而不是(this == null) (2认同)

小智 7

比较 2 个对象的最佳方法是将它们转换为 json 字符串并比较字符串,这是处理复杂嵌套对象、字段和/或包含数组的对象时最简单的解决方案。

样本:

import com.google.gson.Gson;


Object a = // ...;
Object b = //...;
String objectString1 = new Gson().toJson(a);
String objectString2 = new Gson().toJson(b); 

if(objectString1.equals(objectString2)){
    //do this
}
Run Code Online (Sandbox Code Playgroud)

  • 我想称之为:矫枉过正。 (10认同)
  • 因为使用 Java 可以比较对象,而无需先创建 `Gson` 对象然后调用 `toJson`。创建 `Gson` 对象并调用将实际对象转换为平面 `String`(`toJson`)所需的逻辑是不必要的开销。您可以在不先将对象转换为 Json 字符串的情况下比较对象(这也更快)。 (4认同)

Hew*_*lff 6

它看起来equals2只是在调用equals,所以它会给出相同的结果.


小智 5

覆盖函数equals()是错误的。对象“ a”是String类的实例,而“ object2”是MyClass类的实例。它们是不同的类,因此答案是“假”。