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

Я построил класс с одним полем 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));
    }


}

После компиляции в результате появляется два раза 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

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

Ответ 4

Ваш метод equals2() всегда будет возвращать то же самое, что и equals()!!

Ваш код с моими комментариями:

public boolean equals2(Object object2) {  // equals2 method
    if(a.equals(object2)) { // if equals() method returns true
        return true; // return true
    }
    else return false; // if equals() method returns false, also return false
}

Ответ 5

Функция перезаписи equals() неверна. Объект "a" является экземпляром класса String, а "object2" - это экземпляр класса MyClass. Это разные классы, поэтому ответ "ложь".

Ответ 6

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

Ответ 7

Заявления a == object2 и a.equals(object2) оба всегда будут возвращать false, потому что a является string, а object2 является экземпляром MyClass

Ответ 8

Ваша реализация должна понравиться:

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

С помощью этой реализации ваши оба метода будут работать.

Ответ 9

Ваш класс может реализовать интерфейс Comparable для достижения той же функциональности. Ваш класс должен реализовывать метод compareTo(), объявленный в интерфейсе.

public class MyClass implements Comparable<MyClass>{

    String a;

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

    // returns an int not a boolean
    public int compareTo(MyClass someMyClass){ 

        /* The String class implements a compareTo method, returning a 0 
           if the two strings are identical, instead of a boolean.
           Since 'a' is a string, it has the compareTo method which we call
           in MyClass compareTo method.
        */

        return this.a.compareTo(someMyClass.a);

    }

    public static void main(String[] args){

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

        if(object1.compareTo(object2) == 0){
            System.out.println("true");
        }
        else{
            System.out.println("false");
        }
    }
}

Ответ 10

Оператор "==" возвращает true, только если две ссылки указывают на один и тот же объект в памяти. Метод equals(), с другой стороны, возвращает true в зависимости от содержимого объекта.

Пример:

String personalLoan = new String("cheap personal loans");
String homeLoan = new String("cheap personal loans");

//since two strings are different object result should be false
boolean result = personalLoan == homeLoan;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = personalLoan.equals(homeLoan);
System.out.println("Comparing two Strings with same content using equals method: " + result);

homeLoan = personalLoan;
//since both homeLoan and personalLoan reference variable are pointing to same object
//"==" should return true
result = (personalLoan == homeLoan);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

Вывод: Сравнение двух строк с оператором ==: false Сравнение двух строк с одинаковым содержимым с использованием метода equals: true Сравнение двух ссылок на одну строку с оператором ==: true

Вы также можете получить более подробную информацию по ссылке: http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-java.html?m=1

Ответ 11

Если вам не нужно настраивать функцию toString() по умолчанию, другой способ - переопределить метод toString(), который возвращает все сравниваемые атрибуты. затем сравните вывод toString() двух объектов. Я сгенерировал метод toString(), используя IntelliJ IDEA IDE, который включает в себя имя класса в строке.

public class Greeting {
private String greeting;

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    return this.toString().equals(obj.toString());
}

@Override
public String toString() {
    return "Greeting{" +
            "greeting='" + greeting + '\'' +
            '}';
}
}

Ответ 12

возвращаемый тип object.equals уже имеет значение boolean. нет необходимости обертывать его методом с ветвями. поэтому, если вы хотите сравнить 2 объекта, просто сравните их:

boolean b = objectA.equals(objectB);

b уже имеет значение true или false.

Ответ 13

Когда мы используем ==, ссылка объекта сравнивается не с фактическими объектами. Нам нужно переопределить метод equals для сравнения объектов Java.

Некоторая дополнительная информация. C++ имеет оператор с загрузкой, а Java не предоставляет оператора по загрузке. Также в java реализованы другие возможности Compare Interface., Который определяет метод compareTo.

Интерфейс компаратора также используется для сравнения двух объектов

Ответ 14

Здесь вывод будет ложным, false beacuse в первом операторе sopln, который вы пытаетесь сравнить с типом типа строки типа Myclass с другим типом MyClass, и это разрешит, поскольку оба типа объекта, и вы использовали "==" oprerator", который будет проверять значение ссылочной переменной, сохраняя фактическую память, а не фактические контуры внутри памяти. Во втором sopln также это то же самое, что и вы снова вызываете a.equals(object2), где a является varible внутри object1. Дайте мне знать ваши выводы по этому поводу.

Ответ 15

В приведенном ниже коде вы вызываете метод override.equals().

public boolean equals2 (Object object2) {   if (a.equals(object2)) {//здесь вы вызываете метод overriden, поэтому вы получаете false 2 раза.       return true;   }   else возвращает false; }

Ответ 16

 /** Comparing two or more variables. Here the two items are compared and it will return a boolean true or false.
 * 
 * @return equals
 */
public boolean equals(Object item)
{
    String emp1 = this.toString();
    String emp2 = item.toString();
    return emp1.equals(emp2);
}

@Override
//In case you have more than one variable.
public String toString()
{
    return a + b;
}

// a and b represent the variables to display.