wake-up-neo.com

Vergleichen Sie zwei Objekte mit dem Operator .equals () und ==

Ich habe eine Klasse mit einem String-Feld erstellt. Dann habe ich zwei Objekte erstellt und muss sie auch mit == operator und .equals() vergleichen. Folgendes habe ich getan:

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));
    }


}

Nach dem Kompilieren wird als Ergebnis zweimal falsch angezeigt. Warum ist es falsch, wenn die beiden Objekte die gleichen Felder haben - "test"?

65
Fastkowy

== vergleicht Objektreferenzen, prüft, ob die beiden Operanden auf dasselbe Objekt zeigen (nicht äquivalent Objekte, das dasselbe Objekt.

Wenn Sie Zeichenfolgen vergleichen möchten (um zu sehen, ob sie dieselben Zeichen enthalten), müssen Sie die Zeichenfolgen mit equals vergleichen.

Wenn in Ihrem Fall zwei Instanzen von MyClass wirklich als gleich betrachtet werden, wenn die Zeichenfolgen übereinstimmen, gilt Folgendes:

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

... wenn Sie jedoch eine Klasse definieren, bedeutet Äquivalenz mehr als die Äquivalenz eines einzelnen Feldes (in diesem Fall a).


Randbemerkung: Wenn Sie equals überschreiben, müssen Sie fast immer hashCode überschreiben. Wie heißt es in der equals JavaDoc :

Beachten Sie, dass es im Allgemeinen erforderlich ist, die hashCode-Methode zu überschreiben, wenn diese Methode überschrieben wird, um den allgemeinen Vertrag für die hashCode-Methode aufrechtzuerhalten, die besagt, dass gleiche Objekte gleiche Hash-Codes haben müssen.

117
T.J. Crowder

du solltest Gleiches überschreiben 

 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());
   }
16
user5119219

Es sieht so aus, als würde equals2 nur equals aufrufen.

5
Hew Wolff

Die beste Möglichkeit, zwei Objekte zu vergleichen, besteht darin, sie in Json-Strings zu konvertieren und die Strings zu vergleichen. Dies ist die einfachste Lösung, wenn es um komplizierte verschachtelte Objekte, Felder und/oder Objekte geht, die Arrays enthalten.

probe:

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

Die Überschreibfunktion equals () ist falsch ..__ Das Objekt "a" ist eine Instanz der String - Klasse und "object2" ist eine Instanz der MyClass - Klasse. Es sind verschiedene Klassen, daher ist die Antwort "falsch".

Ihre equals2()-Methode gibt immer dasselbe zurück wie equals() !!

Ihr Code mit meinen Kommentaren:

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

Die Anweisungen a == object2 und a.equals(object2) geben immer false zurück, da a eine string ist, während object2 eine Instanz von MyClass ist.

2
ashish.al

Ihre Implementierung muss gefallen:

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

Mit dieser Implementierung würden Ihre beiden Methoden funktionieren.

2
Azhar Khan

Ihre Klasse kann die Comparable-Schnittstelle implementieren, um dieselbe Funktionalität zu erreichen. Ihre Klasse sollte die im Interface deklarierte compareTo () -Methode implementieren.

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

Wenn wir == verwenden, werden die Referenz des Objekts und nicht die tatsächlichen Objekte verglichen. Wir müssen die equals-Methode überschreiben, um Java-Objekte zu vergleichen. 

Einige zusätzliche Informationen, die C++ über Operator beim Laden verfügt, und Java bietet keinen Operator zum Laden ..__ Weitere Möglichkeiten in Java sind implement Compare Interface

Comparator-Schnittstelle wird auch verwendet, um zwei Objekte zu vergleichen

1
umesh atada

der Rückgabetyp object.equals ist bereits boolean . Sie müssen ihn nicht in eine Methode mit Verzweigungen einschließen. Wenn Sie also 2 Objekte vergleichen möchten, vergleichen Sie sie einfach:

boolean b = objectA.equals(objectB);

b ist bereits entweder wahr oder falsch.

1
Cpt. Mirk

Der Operator "==" gibt nur dann "true" zurück, wenn die beiden Verweise auf dasselbe Objekt im Speicher zeigen. Die equals () -Methode hingegen gibt basierend auf dem Inhalt des Objekts true zurück.

Beispiel:

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);

Ausgabe: Vergleichen von zwei Zeichenfolgen mit dem Operator ==: false Vergleichen von zwei Zeichenfolgen mit gleichem Inhalt mit der Methode equals: true Vergleichen von zwei Referenzen, die auf denselben String zeigen, mit dem Operator ==: true

Weitere Informationen erhalten Sie auch über den Link: http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-Java.html?m=1

1
Madhan

Hier ist die Ausgabe false, false, weil in der ersten Sopln-Anweisung Sie versuchen, einen Variablentyp vom Typ Myclass mit dem anderen MyClass-Typ zu vergleichen, und es wird zulassen, dass beide Objekttypen sind und Sie den Operator "==" verwendet haben prüft den Referenzvariablenwert, der den tatsächlichen Speicher enthält, nicht die tatsächlichen Werte im Speicher. Im zweiten sopln ist es auch das Gleiche, als würden Sie wieder a.equals (object2) aufrufen, wobei a eine Variable innerhalb von object1 ist. Lassen Sie mich Ihre Erkenntnisse darüber wissen.

1
Bidyadhar

Wenn Sie die standardmäßige toString () - Funktion nicht anpassen müssen, besteht eine andere Möglichkeit darin, die toString () - Methode zu überschreiben, die alle zu vergleichenden Attribute zurückgibt. Vergleichen Sie dann die Ausgabe von zwei Objekten mit der Strings (). Ich habe die toString () - Methode mit der IntelliJ IDEA - IDE generiert, die den Klassennamen in der Zeichenfolge enthält. 

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