Ich wollte klären, ob ich das richtig verstanden habe:
==
ist ein Referenzvergleich, d.h. beide Objekte zeigen auf denselben Speicherplatz.equals()
wertet den Vergleich der Werte in den Objekten
Ich wollte klären, ob ich das richtig verstanden habe:
==
ist ein Referenzvergleich, d.h. beide Objekte zeigen auf denselben Speicherplatz.equals()
wertet den Vergleich der Werte in den ObjektenDenken Sie einfach daran, dass .equals(...)
muss von der Klasse, die Sie vergleichen wollen, implementiert werden. Andernfalls hat es keinen Sinn; die Version der Methode für die Klasse Object tut das Gleiche wie die Vergleichsoperation: Objekt#equals .
Die einzige Zeit, die Sie wirklich wollen, verwenden Sie den Vergleichsoperator für Objekte ist wen Sie vergleichen Enums. Das liegt daran, dass es immer nur eine Instanz eines Enum-Wertes gibt. Zum Beispiel, wenn die Enum
enum FooEnum {A, B, C}
Sie werden nie mehr als eine Instanz von A
zu einer Zeit, und das gleiche für B
y C
. Dies bedeutet, dass Sie eine Methode wie diese schreiben können:
public boolean compareFoos(FooEnum x, FooEnum y)
{
return (x == y);
}
Und Sie werden keinerlei Probleme haben.
Beispiel 1 -
Die beiden Methoden == und .equals sind nur für den Referenzvergleich da. Es bedeutet, ob beide Objekte auf dasselbe Objekt verweisen oder nicht.
Objektklasse ist gleich Methodenimplementierung
public class HelloWorld{
public static void main(String []args){
Object ob1 = new Object();
Object ob2 = ob1;
System.out.println(ob1 == ob2); // true
System.out.println(ob1.equals(ob2)); // true
}
}
Beispiel 2 -
Aber wenn wir den Inhalt von Objekten mit der equals-Methode vergleichen wollen, muss die Klasse die equals()-Methode der Objektklasse außer Kraft setzen und eine Implementierung für den Vergleich des Inhalts bereitstellen. Hier hat die Klasse String die Methode equals für den Inhaltsvergleich überschrieben. Alle Wrapper-Klassen haben die equals-Methode für den Vergleich von Inhalten außer Kraft gesetzt.
String-Klasse gleich Methodenimplementierung
public class HelloWorld{
public static void main(String []args){
String ob1 = new String("Hi");
String ob2 = new String("Hi");
System.out.println(ob1 == ob2); // false (Both references are referring two different objects)
System.out.println(ob1.equals(ob2)); // true
}
}
Beispiel 3 -
Im Falle von String gibt es einen weiteren Anwendungsfall. Wenn wir hier eine beliebige Zeichenkette einer String-Referenz zuweisen, wird eine String-Konstante innerhalb von String-Konstanten-Pool . Wenn wir dieselbe Zeichenfolge einer neuen String-Referenz zuweisen, wird keine neue String-Konstante erstellt, sondern auf eine vorhandene String-Konstante verwiesen.
public class HelloWorld{
public static void main(String []args){
String ob1 = "Hi";
String ob2 = "Hi";
System.out.println(ob1 == ob2); // true
System.out.println(ob1.equals(ob2)); // true
}
}
Beachten Sie, dass es im Allgemeinen notwendig ist, die hashCode-Methode zu überschreiben, wenn diese Methode überschrieben wird, um den allgemeinen Vertrag für die hashCode-Methode einzuhalten, der besagt, dass gleiche Objekte gleiche Hashcodes haben müssen.
Der Hauptunterschied zwischen == und equals() ist
1) == wird zum Vergleich von Primitiven verwendet.
Zum Beispiel:
String string1 = "Ravi";
String string2 = "Ravi";
String string3 = new String("Ravi");
String string4 = new String("Prakash");
System.out.println(string1 == string2); // true because same reference in string pool
System.out.println(string1 == string3); // false
2) equals() wird verwendet, um Objekte zu vergleichen. Zum Beispiel:
System.out.println(string1.equals(string2)); // true equals() comparison of values in the objects
System.out.println(string1.equals(string3)); // true
System.out.println(string1.equals(string4)); // false
Wenn Sie den Code auswerten, ist es sehr klar, dass (==) nach der Speicheradresse vergleicht, während equals(Object o) den HashCode() der Instanzen vergleicht. Deshalb heißt es, dass man den Vertrag zwischen equals() und hashCode() nicht brechen sollte, wenn man später keine Überraschungen erleben will.
String s1 = new String("Ali");
String s2 = new String("Veli");
String s3 = new String("Ali");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println("(s1==s2):" + (s1 == s2));
System.out.println("(s1==s3):" + (s1 == s3));
System.out.println("s1.equals(s2):" + (s1.equals(s2)));
System.out.println("s1.equal(s3):" + (s1.equals(s3)));
/*Output
96670
3615852
96670
(s1==s2):false
(s1==s3):false
s1.equals(s2):false
s1.equal(s3):true
*/
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.