2013-03-23 7 views

risposta

0

equals metodo è in origine un metodo di classe Object. E ogni classe in Java estende la classe Object per impostazione predefinita. Ora, il metodo equals viene sovrascritto per la classe String per agire diversamente da ==.

E 'javadoc spiega perfettamente:

confronto tra questa stringa per l'oggetto specificato. Il risultato è true se e solo se l'argomento non è null ed è un oggetto stringa che rappresenta la stessa sequenza di caratteri di questo oggetto .

E 'implementazione va come segue:

@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

il metodo equals nella classe String viene ignorato e si cerca di verificare se tutti i personaggi in entrambe le stringhe sono uguali oppure no. Se trovato, restituisce true. Quindi il comportamento del metodo equals nella classe String è diverso dalla normale implementazione della classe oggetto di esso.

7

Sì, per impostazione predefinita è uguale al metodo == nella classe Object. Ma puoi sostituire il metodo equals nella tua classe per cambiare il modo in cui lo equality viene eseguito tra due oggetti della stessa classe. Per esempio il metodo equals in String classe è sovrascritta come segue:

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

quindi questo è il motivo per cui per il seguente codice:

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

s1==s2 rendimenti false poiché entrambi fanno riferimento diversi oggetti sul mucchio. Mentre s1.equals(s2) restituisce true poiché ora viene chiamato il numero equals, viene definito ciò che viene definito nella classe String in cui gli oggetti String vengono confrontati sulla base di contents di String.

+1

No, per impostazione predefinita 'equals' non implementa' == 'per la classe String. E la sua domanda era come anche se gli uguali implementassero '==' si comportano entrambi in modo diverso! – Amar

+0

@Amar: vai a rileggere la domanda e pensa in modo maturo prima di ridiscutere la risposta di qualcuno. L'OP sta chiedendo che dal momento che il metodo 'equals' per i controlli di default per' == ', allora come mai quel metodo' equals' per due diversi 'String' con lo stesso contenuto che restituisce' true'. E questo è quello che ho spiegato il motivo di ciò nella mia risposta .. Rileggi anche la mia risposta .. –

+0

Forse! Quello che ho capito dalla domanda che ha effettivamente visto l'implementazione della String e che è stato confuso dal '==' iniziale nel metodo. Se questa comprensione è sbagliata, certamente riprenderò il mio voto negativo. A proposito, non c'è bisogno di ottenere personale qui e commentare la mia maturità. Freddo. – Amar

0

.equals() controlla se le stringhe sono identiche ei. avere gli stessi personaggi == controlla solo se i puntatori puntano agli stessi oggetti. Si possono avere diversi oggetti con gli stessi caratteri, questo è il motivo per cui si dovrebbe usare .equals() per confrontarli

0

String classe in Java ridefinisce il metodo di Object classe equals tale che confronta il contenuto delle due stringhe piuttosto che confrontando i riferimenti (implementazione predefinita della classe Object).

Vedere sotto l'attuazione equals metodo String classe:

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