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"?
==
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 diehashCode
-Methode aufrechtzuerhalten, die besagt, dass gleiche Objekte gleiche Hash-Codes haben müssen.
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());
}
Es sieht so aus, als würde equals2
nur equals
aufrufen.
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
}
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
}
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.
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.
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");
}
}
}
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
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.
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
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.
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 + '\'' +
'}';
}
}