Вопрос-ответ

Compare two objects with .equals() and == operator

Сравнить два объекта с помощью .equals() и == оператора

Я создал класс с одним String полем. Затем я создал два объекта, и мне также нужно сравнить их с помощью == operator and .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));
}


}

После компиляции в результате дважды отображается false . Почему это false, если два объекта имеют одинаковые поля - "test"?

Переведено автоматически
Ответ 1

== сравнивает ссылки на объекты, проверяет, указывают ли два операнда на один и тот же объект (не на эквивалентные объекты, на один и тот же объект).

Если вы хотите сравнить строки (чтобы увидеть, содержат ли они одинаковые символы), вам нужно сравнить строки с помощью equals.

В вашем случае, если два экземпляра MyClass действительно считаются равными, если строки совпадают, то:

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

...но обычно, если вы определяете класс, эквивалентность важнее, чем эквивалентность одного поля (a в данном случае).


Примечание: если вы переопределяете equals, вам почти всегда нужно переопределять hashCode. Как сказано в equals JavaDoc:


Обратите внимание, что обычно необходимо переопределять hashCode метод всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт для hashCode метода, в котором говорится, что равные объекты должны иметь одинаковые хэш-коды.


Ответ 2

Вы должны переопределить equals

 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());
}
Ответ 3

Лучший способ сравнить 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
}
Ответ 4

Похоже, что equals2 это просто вызов equals, поэтому он даст те же результаты.

java class