Was ist der Unterschied zwischen == und der Methode equal in Java und wie führt == zu primitiven Datentypen und Zeichenfolgentypen?


Antwort 1:

Abgesehen von den Primitiven ist in Java alles ein Objekt, das um das Java.lang.Object erweitert wird. Die equals () und andere Methoden werden in der Object-Klasse definiert. Daher haben alle Java-Klassen standardmäßig die Methode equals (). Um zu testen, ob zwei Objektinstanzen gleich sind, verwenden wir die Methode equals (). Es wird empfohlen, diese Methode zu überschreiben, wenn wir die Objekte vergleichen möchten, um ihre Gleichheit basierend auf den Geschäftsanforderungen zu testen. Wenn die equals-Methode nicht überschrieben wird, wird die Standardimplementierung der equals-Methode () verwendet, die von der Object-Klasse geerbt wurde.

Standardverhalten von equals (Wenn die Methode equals nicht überschrieben wird) - Wenn die Methode equals nicht überschrieben wird, prüft die Standardimplementierung von equals (), ob die Objektreferenzen der beiden verglichenen Objekte gleich sind, d. H. Wenn beide verglichenen Objekte gleich sind genau das gleiche Objekt. Dies ist das Gleiche wie die Prüfung "==" an zwei Objekten, die den Wert (d. H. Die Speicheradresse im Heap) der beiden Objekte prüft. == gibt also nur dann true zurück, wenn sich die Referenzen der verglichenen Objekte auf dieselbe Objektinstanz beziehen.

Referenz-JAVAINUSE



Antwort 2:

Zunächst ist == ein Operator in Java, während equals () (oder besser als equals (Object o) geschrieben) eine Methode ist.

Der Operator == kann zum Vergleichen von Werten von Grundelementen verwendet werden, er kann jedoch auch zum Bestimmen verwendet werden, ob zwei Referenzvariablen auf dasselbe Objekt verweisen. Beim Vergleich von Referenzvariablen gibt == nur dann true zurück, wenn beide Referenzen auf dasselbe Objekt verweisen.

Die Methode equals () in der Klasse Object verwendet nur den Operator == für Vergleiche. Wenn Sie also die Methode equals () nicht überschreiben, werden zwei Objekte nur dann als gleich betrachtet, wenn sich die beiden Referenzen auf dasselbe Objekt beziehen.

 public boolean equals (Object obj) {
        return (this == obj);
    }

Sie können den Operator == nicht überladen, aber Sie können equals (Object) überschreiben, wenn Sie möchten, dass er sich anders als der Operator == verhält, d. H. Referenzen nicht vergleichen, sondern die Objekte tatsächlich vergleichen (z. B. alle oder einige ihrer Felder verwenden). Für String- und alle Wrapper-Klassen wird der Vergleich des Werts und nicht des Speicherorts bereits überschrieben.

Wenn Sie equals (Object) überschreiben, sehen Sie sich auch hashCode () an. Diese beiden Methoden müssen kompatibel sein (dh zwei Objekte, die gemäß equals (Object) gleich sind, müssen denselben hashCode () haben), da sonst alle Arten von seltsamen Fehlern auftreten (z. B. beim Hinzufügen der Objekte zu einem Set oder einer Karte). .

int a = 5;
int b = 5;
int c = a;

System.out.println (a == b); // true
System.out.println (b == c); // true
System.out.println (a == c); // true
// Die Methode equals () ist für Grundelemente nicht zulässig

String str1 = neuer String ("hallo");
String str2 = neuer String ("hallo");
String str3 = str1;

System.out.println (str1 == str2); // false
System.out.println (str2 == str3); // false
System.out.println (str1 == str3); // true
System.out.println (str1.equals (str2)); // true
System.out.println (str2.equals (str3)); // true
System.out.println (str1.equals (str3)); // true

Ganze Zahl i1 = neue ganze Zahl (1000);
Ganze Zahl i2 = neue ganze Zahl (1000);
Ganze Zahl i3 = 1000;
Ganze Zahl i4 = 1000;
Ganze Zahl i5 = i4;

System.out.println (i1 == i2); // false
System.out.println (i3 == i4); // false
System.out.println (i5 == i4); // true
System.out.println (i1.equals (i2)); // true
System.out.println (i3.equals (i4)); // true
System.out.println (i5.equals (i4)); // true