2013-03-23 5 views
5

Wir alle wissen, wenn wir zwei String-Objekte erstellen und == verwenden, um sie zu vergleichen, wird es false zurückgeben, und wenn wir equals zu Methode verwenden, wird True zurückgeben. Aber standardmäßig equals Methode implementieren == nur, dann, wie es wahr zurückgibt, sollte es zurückgegeben werden, was == zurückgibt ??Wie funktioniert der Standardwert für die Implementierung in Java für String?

+0

Methode equals in String-Klasse außer Kraft gesetzt wird. Deshalb. – AmitG

Antwort

0

equals Methode ist ursprünglich eine Methode der Object Klasse. Und jede Klasse in Java erweitert die Klasse Object standardmäßig. Jetzt wird equals Methode für String Klasse überschrieben, anders als == zu handeln.

Es ist javadoc erklärt es perfekt:

Vergleicht diese Zeichenfolge mit dem angegebenen Objekt. Das Ergebnis ist wahr, wenn und nur wenn das Argument nicht null ist und ein String-Objekt, das die gleiche Zeichenfolge wie dieses Objekt darstellt.

Es ist geht die Umsetzung wie folgt:

@override 
public boolean equals(Object anObject) { 
// This check is just for the case when exact same String object is passed 
if (this == anObject) { 
    return true; 
} 
// After this only real implementation of equals start which you might be looking for 
// For other cases checks start from here 
if (anObject instanceof String) { 
    String anotherString = (String)anObject; 
    int n = count; 
    if (n == anotherString.count) { 
    char v1[] = value; 
    char v2[] = anotherString.value; 
    int i = offset; 
    int j = anotherString.offset; 
    while (n-- != 0) { 
     if (v1[i++] != v2[j++]) 
     return false; 
    } 
    return true; 
    } 
} 
return false; 
} 
1

die Methode equals in der String-Klasse außer Kraft gesetzt wird und es versucht, alle zu überprüfen, ob die Zeichen in den beiden Strings gleich sind oder nicht. Wenn es gefunden wird, wird es als wahr zurückgegeben. Daher unterscheidet sich das Verhalten der equals-Methode in der String-Klasse von der normalen Objektklassenimplementierung.

7

Ja standardmäßig gleich Methode implementiert == in Object Klasse. Aber Sie können die equals Methode in Ihrer eigenen Klasse überschreiben, um die Art und Weise zu ändern, wie equality zwischen zwei Objekten der gleichen Klasse ausgeführt wird. Zum Beispiel wird die equals Methode in String Klasse überschrieben wie folgt:

public boolean equals(Object anObject) { 
      if (this == anObject) { 
       return true; 
      } 
      if (anObject instanceof String) { 
       String anotherString = (String)anObject; 
       int n = count; 
       if (n == anotherString.count) { 
        char v1[] = value; 
        char v2[] = anotherString.value; 
        int i = offset; 
        int j = anotherString.offset; 
        while (n-- != 0) { 
         if (v1[i++] != v2[j++]) 
          return false; 
        } 
        return true; 
       } 
      } 
      return false; 
     } 

Das ist also der Grund dafür, dass für den folgenden Code:

String s1 = new String("java"); 
String s2 = new String("java"); 

s1==s2 kehrt false da beide verweisen auf verschiedene Objekte auf Heap. Wohingegen s1.equals(s2)true zurückgibt, da jetzt die equals genannt wird, was innerhalb der String Klasse definiert ist, wo String Objekte auf der Basis von contents von String verglichen werden.

+1

Nein standardmäßig 'Equals' implementiert nicht '== 'für String-Klasse. Und seine Frage war, wie auch wenn equals "==" umsetzen, sie beide sich anders verhalten! – Amar

+0

@Amar: Gehen Sie und lesen Sie die Frage und denken Sie reif, bevor Sie jemandes Antwort ablehnen. OP fragt, da die 'equals' Methode standardmäßig nach' == 'sucht, wie kommt dann diese' equals' Methode für zwei verschiedene 'String' mit gleichen Inhalten, die' true' zurückgeben. Und das ist, was ich in meiner Antwort den Grund dafür erklärt habe .. Lesen Sie meine Antwort auch wieder .. –

+0

Vielleicht! Was ich aus der Frage verstand, dass er die Implementierung des Strings tatsächlich gesehen hat und durch die anfängliche '==' Prüfung in der Methode verwirrt wurde. Wenn dieses Verständnis falsch ist, werde ich sicherlich meinen Downvote zurücknehmen. BTW, keine Notwendigkeit, hier persönlich zu kommentieren und meine Reife zu kommentieren. Ausruhen. – Amar

0

.equals() überprüft, ob die Strings gleich ei. habe die gleichen Charaktere. == prüft nur, ob Zeiger auf dieselben Objekte zeigen. Sie können verschiedene Objekte mit den gleichen Zeichen haben, das ist, warum Sie .equals() verwenden sollten sie

0

String Klasse in Java überschreibt die equals Methode der Object Klasse zu vergleichen, so dass sie den Inhalt der beiden Strings vergleicht, anstatt die Referenzen zu vergleichen (Standard-Implementierung von in Object Klasse).

Siehe unten die equals Methode Implementierung von String Klasse:

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
     char v1[] = value; 
     char v2[] = anotherString.value; 
     int i = offset; 
     int j = anotherString.offset; 
     while (n-- != 0) { 
      if (v1[i++] != v2[j++]) 
      return false; 
     } 
     return true; 
     } 
    } 
    return false; 
    }