781 Stimmen

Was ist der Unterschied zwischen == und equals() in Java?

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

5voto

fruchtose Punkte 1230

Denken 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.

4voto

pathe.kiran Punkte 2334

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

enter image description here

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

enter image description here

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

enter image description here

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.

Java-API-Methodenvertrag equals()

4voto

Ravi Patel Punkte 129

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

4voto

huseyin Punkte 1175

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
    */

3voto

bfs Punkte 192

Beachten Sie auch, dass .equals() enthält normalerweise == zu testen, da dies das erste ist, worauf man testen möchte, wenn man prüfen möchte, ob zwei Objekte gleich sind.

Und == prüft bei primitiven Typen tatsächlich die Werte, bei Objekten wird die Referenz geprüft.

CodeJaeger.com

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.

Powered by:

X