Как переопределить метод equals () в java [duplicate]

Если ни одно из вышеперечисленных решений не работает (ничего не работает для меня), то просто RESTART ваш компьютер, и вы сможете подключиться к вашему серверу sql (localhost).

60
задан Mark 1 February 2017 в 13:20
поделиться

16 ответов

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

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

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

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

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


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

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

105
ответ дан T.J. Crowder 19 August 2018 в 16:49
поделиться
 /** 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.
-2
ответ дан Baez G John 19 August 2018 в 16:49
поделиться
  • 1
    Добавьте объяснение своего ответа, чтобы помочь OP и будущим читателям понять это. – Luis Muñoz 30 May 2018 в 23:28

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

1
ответ дан Bidyadhar 19 August 2018 в 16:49
поделиться
  • 1
    Добро пожаловать в stackoverflowflow bidyadhar. Вопрос датирован 14/11/2012 и получил уже хороший ответ (одобрен OP). Тот, который у вас есть, правильный, но он не добавляет полезной информации. Я предлагаю вам прочитать правила, прежде чем делать что-либо – Nikaidoh 6 July 2017 в 14:56

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

boolean b = objectA.equals(objectB);

b уже либо истинно, либо false.

1
ответ дан Cpt. Mirk 19 August 2018 в 16:49
поделиться

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

5
ответ дан Hew Wolff 19 August 2018 в 16:49
поделиться

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

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

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

2
ответ дан Jared Burrows 19 August 2018 в 16:49
поделиться

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

4
ответ дан Jesús Talavera Portocarrero 19 August 2018 в 16:49
поделиться

Ваш метод 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
}
4
ответ дан jlordo 19 August 2018 в 16:49
поделиться

Лучший способ сравнить 2 объекта - это преобразовать их в строки json и сравнить строки, это самое простое решение при работе со сложными вложенными объектами, полями и / или объектами, которые содержат массивы.

sample :

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
ответ дан JoeG 19 August 2018 в 16:49
поделиться
  • 1
    Я хотел бы назвать это: overkill. – Rolf ツ 2 January 2017 в 16:40
  • 2
    @ Rolf ツ Почему это, по-вашему, слишком велико? Я искал решение этой проблемы, и это самое простое решение, которое я нашел до сих пор. Любые лучшие предложения приветствуются. – m5seppal 20 December 2017 в 14:09
  • 3
    Потому что с Java вы можете сравнивать объекты без предварительного создания объекта Gson, а затем вызывать toJson. Создание объекта Gson и вызов логики, необходимой для преобразования фактического объекта в плоский String (toJson), являются излишними накладными расходами. Вы можете сравнивать объекты без предварительной конвертации объектов в строки Json (что также быстрее). – Rolf ツ 20 December 2017 в 14:14

Оператор «==» возвращает 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 personalLoand 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 .в / 2012/12 / разница между ними-равно-метод-и-равенство-оператор-java.html? т = 1

1
ответ дан Madhan 19 August 2018 в 16:49
поделиться

Если вам не нужно настраивать функцию 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 + '\'' +
            '}';
}
}
0
ответ дан Qinjie 19 August 2018 в 16:49
поделиться

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

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

-3
ответ дан Ram 19 August 2018 в 16:49
поделиться
  • 1
    Нет, a.equals - строковый метод, он нигде не переопределяется. – Tarec 14 May 2014 в 16:40

Ваш класс может реализовать интерфейс 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's compareTo method.
        */

        if(this.a.compareTo(someMyClass.a) == 0) return 0; 
        return 1;
    }

    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");
        }
    }
}
2
ответ дан tectonicfury 19 August 2018 в 16:49
поделиться

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

Некоторая дополнительная информация C ++ имеет оператор над загрузкой & amp; Java не обеспечивает оператора при загрузке. Кроме того, в java существуют другие возможности реализации интерфейса сравнения. Он определяет метод compareTo.

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

1
ответ дан umesh atada 19 August 2018 в 16:49
поделиться
  • 1
    Подумайте, что ваш ответ добавляет ничего, что не было сказано почти 2 года назад. – Hot Licks 8 September 2014 в 05:14

вы должны переопределить 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());
   }
12
ответ дан user5119219 19 August 2018 в 16:49
поделиться
  • 1
    Это, возможно, лучший ответ, однако вы можете использовать this.equals (obj) вместо (this == null) для не примитивных типов – goonerify 25 November 2015 в 06:18
  • 2
    Я бы сказал, что случай if (this == null) в любом случае не нужен; вызов nullObject.equals(whatever) собирается выбросить исключение нулевого указателя, поэтому мы можем с уверенностью предположить, что this не является нулевым в любом методе Java, который мы можем написать. – Maura 3 October 2016 в 21:42
  • 3
    это не сработает, если this имеет lastname null и не удовлетворяет предыдущим условиям. – Ahmed Raaj 5 January 2018 в 08:57

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

2
ответ дан VMAtm 19 August 2018 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: