2013-03-23 7 views
5

Wszyscy wiemy, że jeśli utworzymy dwa obiekty String i użyjemy == do ich porównania, to zwróci wartość false, a jeśli użyjemy metody równości, zwróci true. Ale domyślnie równa się, że metoda implementuje tylko ==, to w jaki sposób zwraca true, powinna zwrócić to, co powróci ==?jak domyślne jest wykonanie w java dla String?

+0

równa jest przesłonięta metoda w klasie String. Dlatego. – AmitG

Odpowiedz

0

equals Metoda jest pierwotnie metodą klasy Object. I każda klasa w Javie domyślnie rozszerza klasę Object. Teraz metoda equals jest nadpisywana dla klasy String, aby działała inaczej niż ==.

To javadoc wyjaśnia to doskonale:

Porównuje ten ciąg do określonego obiektu. Wynikiem jest true wtedy i tylko wtedy, gdy argument nie jest pusty i jest to obiekt String reprezentujący tę samą sekwencję znaków, co obiekt .

To realizacja idzie w następujący sposób:

@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

metoda równi z klasy String jest przesłonięta i próbuje sprawdzić, czy wszystkie znaki w obu ciągów są równe lub nie. Jeśli zostanie znaleziony, zwróci true. Zatem zachowanie metody równości w klasie String różni się od normalnej implementacji klasy obiektu.

7

Tak domyślnie równa się metoda implementuje == w klasie Object. Ale możesz zastąpić metodę equals w swojej własnej klasie, aby zmienić sposób, w jaki equality jest wykonywany między dwoma obiektami tej samej klasy. Na przykład metoda String klasy equals jest przesłonięta, co następuje:

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

Więc to jest powód, że za pomocą następującego kodu:

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

s1==s2 zwrotów false ponieważ oba są przedstawieniu różnych obiektów na stercie. Podczas gdy s1.equals(s2) zwraca true od tego, co nazywa equals, to co zdefiniowano w klasie String, gdzie obiekty String są porównywane na podstawie contents ciągu.

+1

Nie domyślnie 'równa się' nie implementuje' == 'dla klasy String. I jego pytanie brzmiało, że nawet jeśli równe sobie zaimplementują '==', obie zachowują się inaczej! – Amar

+0

@Amar: Idź i ponownie przeczytaj pytanie i pomyśl starannie przed odrzuceniem czyjejś odpowiedzi. OP pyta, że ​​skoro metoda "równa się" domyślnie sprawdza dla '==', to jak to się stało, że metoda 'równa się' dla dwóch różnych' String' z tą samą zawartością zwraca 'true'. I to właśnie wyjaśniłem powód tego w mojej odpowiedzi. Ponownie przeczytaj moją odpowiedź też .. –

+0

Może! Co zrozumiałam z pytania, że ​​faktycznie widział implementację Stringa i został zdezorientowany przez początkowe "==" sprawdzenie w metodzie. Jeśli to zrozumienie jest złe, z pewnością odzyskam moje poparcie. BTW, nie ma potrzeby, aby uzyskać osobisty tutaj i komentarz na temat mojej dojrzałości. Chłód. – Amar

0

.equals() sprawdza, czy ciągi są identyczne ei. mają te same znaki. == sprawdza tylko, czy wskaźniki wskazują te same obiekty. Można mieć różne obiekty z tych samych znaków, to dlaczego należy użyć .equals() porównać je

0

String klasa w Javie nadpisuje metodę Object klasy equals taki sposób, że porównuje zawartość dwóch ciągów zamiast porównywania referencji (domyślna implementacja w klasie Object).

Poniżej realizacji equals metoda String klasy:

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; 
    } 
Powiązane problemy