Domanda

So che == presenta alcuni problemi quando si confrontano due stringhe . Sembra che String.equals () sia un approccio migliore. Bene, sto facendo i test JUnit e la mia inclinazione è usare assertEquals (str1, str2) . È un modo affidabile per affermare che due stringhe contengono lo stesso contenuto? Vorrei usare assertTrue (str1.equals (str2)) , ma poi non otterresti il ??vantaggio di vedere quali sono i valori previsti ed effettivi in ??caso di fallimento.

In una nota correlata, qualcuno ha un link a una pagina o thread che spiega chiaramente i problemi con str1 == str2 ?

È stato utile?

Soluzione

Dovresti sempre utilizzare .equals () quando si confronta Stringhe in Java.

JUnit chiama il metodo .equals () per determinare l'uguaglianza nel metodo assertEquals (Object o1, Object o2) .

Quindi, sei decisamente sicuro usando assertEquals (string1, string2) . (Poiché String sono Object )

Ecco un link a una grande domanda Stackoverflow riguardo ad alcune delle differenze tra == e .equals () .

Altri suggerimenti

assertEquals utilizza il metodo equals per il confronto. Esiste un'altra asserzione, assertSame , che utilizza l'operatore == .

Per capire perché == non dovrebbe essere usato con le stringhe devi capire cosa fa == : fa un controllo di identità. Ossia, a == b verifica se a e b si riferiscono allo stesso oggetto . È incorporato nella lingua e il suo comportamento non può essere modificato da classi diverse. Il metodo equals , d'altra parte, può essere ignorato dalle classi. Mentre il suo comportamento predefinito (nella classe Object ) è quello di effettuare un controllo dell'identità utilizzando l'operatore == , molte classi, tra cui String , hanno la precedenza invece di fare un '"equivalenza" dai un'occhiata. Nel caso di String , invece di verificare se a e b si riferiscono allo stesso oggetto, a.equals (b) controlla se gli oggetti a cui fanno riferimento sono entrambe stringhe che contengono esattamente gli stessi caratteri.

Tempo di analogia: immagina che ogni oggetto String sia un pezzo di carta con sopra scritto qualcosa. Diciamo che ho due pezzi di carta con " Foo " scritto su di essi, e un altro con " Bar " scritto su di esso. Se prendo i primi due pezzi di carta e utilizzo == per confrontarli, verrà restituito false perché essenzialmente chiede "questi sono gli stessi pezzi di carta?" . Non ha nemmeno bisogno di guardare ciò che è scritto sul foglio. Il fatto che gli do due pezzi di carta (anziché due volte lo stesso) significa che restituirà false . Se uso uguale a , tuttavia, il metodo uguale a leggerà i due pezzi di carta e vedrà che dicono la stessa cosa (" Foo "), e quindi ' Restituirà true .

Il bit che confonde con Strings è che Java ha un concetto di "interning" Stringhe e questo viene (efficacemente) eseguito automaticamente su qualsiasi valore letterale di stringa nel codice. Ciò significa che se nel tuo codice sono presenti due letterali stringa equivalenti (anche se si trovano in classi diverse), entrambi faranno effettivamente riferimento allo stesso oggetto String . Questo rende l'operatore == restituito true più spesso di quanto ci si potrebbe aspettare.

In poche parole: puoi avere due oggetti String che contengono gli stessi caratteri ma sono oggetti diversi (in posizioni di memoria diverse). L'operatore == verifica che due riferimenti puntino allo stesso oggetto (posizione di memoria), ma il metodo equals () controlla se i caratteri sono uguali.

Di solito sei interessato a verificare se due stringhe contengono gli stessi caratteri, non se indicano la stessa posizione di memoria.

Sì, viene sempre utilizzato per i test. È molto probabile che il framework di test usi .equals () per confronti come questi.

Di seguito è riportato un link che spiega l'errore "uguaglianza di stringa". In sostanza, le stringhe in Java sono oggetti e quando si confronta l'uguaglianza degli oggetti, in genere vengono confrontate in base all'indirizzo di memoria e non in base al contenuto. Per questo motivo, due stringhe non occuperanno lo stesso indirizzo, anche se il loro contenuto è identico, quindi non corrisponderanno correttamente, anche se sembrano uguali quando vengono stampate.

http: //blog.enrii. com / 2006/03/15 / java-string-uguaglianza-common-errore /

public class StringEqualityTest extends TestCase {
    public void testEquality() throws Exception {
        String a = "abcde";
        String b = new String(a);
        assertTrue(a.equals(b));
        assertFalse(a == b);
        assertEquals(a, b);
    }
}

JUnit assertEquals (obj1, obj2) in effetti chiama obj1.equals (obj2) .

C'è anche assertSame (obj1, obj2) che fa obj1 == obj2 (cioè verifica che obj1 e obj2 fanno riferimento alla stessa istanza), che è ciò che stai cercando di evitare.

Quindi stai bene.

  

" L'operatore == verifica se due Oggetti sono esattamente lo stesso Oggetto . "

http://leepoint.net/notes-java/data/strings /12stringcomparison.html

String è un Object in java, quindi rientra in quella categoria di regole di confronto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top