Ich habe eine Klasse mit einem String
Feld aufgebaut. Dann habe ich zwei Objekte erstellt und muss sie auch mit dem ==
Operator vergleichen .equals()
. 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 false angezeigt. Warum ist es falsch, wenn die beiden Objekte die gleichen Felder haben - "Test"?
equals
undequals2
: jedes Mal , wenn etwas von der Form haben ,if(a) { return true; } else { return false; }
sollten Sie wahrscheinlich nur schreibenreturn a
.true
ob dies der Fall ist undfalse
nicht. So könnte es zum Beispielif(a.equals(object2)) { return true; } else return false
einfach seinreturn a.equals(object2)
.Antworten:
==
Vergleicht Objektreferenzen und prüft, ob die beiden Operanden auf dasselbe Objekt verweisen (keine äquivalenten Objekte, dasselbe Objekt).Wenn Sie Zeichenfolgen vergleichen möchten (um festzustellen, ob sie dieselben Zeichen enthalten), müssen Sie die Zeichenfolgen mit vergleichen
equals
.In Ihrem Fall, wenn zwei Instanzen von
MyClass
wirklich als gleich angesehen werden, wenn die Zeichenfolgen übereinstimmen, dann:... aber normalerweise, wenn Sie eine Klasse definieren, ist Äquivalenz mehr als die Äquivalenz eines einzelnen Feldes (
a
in diesem Fall).Randnotiz: Wenn Sie überschreiben
equals
, müssen Sie fast immer überschreibenhashCode
. Wie es imequals
JavaDoc heißt :quelle
Sie sollten gleich überschreiben
quelle
if (this == null)
Fall sowieso unnötig ist; Der AufrufnullObject.equals(whatever)
löst eine Nullzeigerausnahme aus, sodass wir davon ausgehen können, dassthis
diese in keiner Java-Methode, die wir schreiben, null ist.this
hatlastname
null und nicht vorherige Bedingungen erfüllen.Es sieht so aus,
equals2
als würde nur angerufenequals
, sodass die gleichen Ergebnisse erzielt werden.quelle
Die Überschreibungsfunktion equals () ist falsch. Das Objekt "a" ist eine Instanz der String- Klasse und "object2" ist eine Instanz der MyClass- Klasse. Sie sind verschiedene Klassen, daher lautet die Antwort "falsch".
quelle
Der beste Weg, um 2 Objekte zu vergleichen, besteht darin, sie in JSON-Zeichenfolgen zu konvertieren und die Zeichenfolgen zu vergleichen. Dies ist die einfachste Lösung, wenn Sie mit komplizierten verschachtelten Objekten, Feldern und / oder Objekten arbeiten, die Arrays enthalten.
Stichprobe:
quelle
Gson
Objekt zu erstellen und dann aufzurufentoJson
. Das Erstellen desGson
Objekts und das Aufrufen der Logik, die zum Konvertieren des tatsächlichen Objekts in eine flatString
(toJson
) erforderlich ist, ist kein unnötiger Aufwand. Sie können Objekte vergleichen, ohne die Objekte zuerst in Json-Zeichenfolgen zu konvertieren (was auch schneller ist).Ihre
equals2()
Methode gibt immer die gleiche zurück wieequals()
!!Ihr Code mit meinen Kommentaren:
quelle
return a.equals(object2);
Anweisungen
a == object2
unda.equals(object2)
beide werden immer zurückgegeben,false
daa
einestring
Weileobject2
eine Instanz von istMyClass
quelle
Ihre Implementierung muss wie folgt aussehen:
Mit dieser Implementierung würden beide Methoden funktionieren.
quelle
Wenn Sie die Standardfunktion toString () nicht anpassen müssen, können Sie auch die Methode toString () überschreiben, die alle zu vergleichenden Attribute zurückgibt. Vergleichen Sie dann die Ausgabe von String () von zwei Objekten. Ich habe die toString () -Methode mit IntelliJ IDEA IDE generiert, die den Klassennamen in der Zeichenfolge enthält.
quelle
Der Operator "==" gibt nur dann true zurück, wenn die beiden Referenzen auf dasselbe Objekt im Speicher verweisen. Die Methode equals () gibt dagegen basierend auf dem Inhalt des Objekts true zurück.
Beispiel:
Ausgabe: Vergleichen von zwei Zeichenfolgen mit dem Operator ==: false Vergleichen von zwei Zeichenfolgen mit demselben 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
quelle
Ihre Klasse implementiert möglicherweise die Schnittstelle Comparable, um dieselbe Funktionalität zu erzielen. Ihre Klasse sollte die in der Schnittstelle deklarierte compareTo () -Methode implementieren.
quelle
Der Rückgabetyp von object.equals ist bereits boolesch. Es ist nicht erforderlich, es in eine Methode mit Zweigen zu verpacken. Wenn Sie also 2 Objekte vergleichen möchten, vergleichen Sie sie einfach:
b ist bereits entweder wahr oder falsch.
quelle
Wenn wir == verwenden, wird die Referenz des Objekts verglichen, nicht die tatsächlichen Objekte. Wir müssen die Methode equals überschreiben, um Java-Objekte zu vergleichen.
Einige zusätzliche Informationen C ++ verfügt über einen Operator zum Laden und Java bietet keinen Operator zum Laden. Weitere Möglichkeiten in Java sind die Implementierung der Vergleichsschnittstelle, die eine compareTo-Methode definiert.
Die Komparatorschnittstelle wird auch verwendet, um zwei Objekte zu vergleichen
quelle
Hier ist die Ausgabe falsch, falsch, weil in der ersten sopln-Anweisung Sie versuchen, eine Zeichenfolgentypvariable vom Typ Myclass mit dem anderen MyClass-Typ zu vergleichen, und dies ermöglicht, da beide Objekttypen sind und Sie den Operator "==" verwendet haben prüft den Referenzvariablenwert, der den tatsächlichen Speicher enthält, nicht die tatsächlichen Contnets im Speicher. Auch im zweiten sopln ist es dasselbe, als würden Sie wieder a.equals (object2) aufrufen, wobei a eine Variable innerhalb von object1 ist. Teilen Sie mir Ihre diesbezüglichen Erkenntnisse mit.
quelle
Im folgenden Code rufen Sie die Überschreibungsmethode .equals () auf.
public boolean equals2 (Object object2) {if (a.equals (object2)) {// Hier rufen Sie die Overriden-Methode auf, weshalb Sie zweimal false erhalten. return true; } else return false; }}
quelle
a.equals
ist die Methode von string, sie wird nirgendwo überschrieben.