Domanda

Io uso il == nel codice qui sotto e stampe fuori "uguale!", Perché? Qualcuno può spiegare perché queste due stringhe A e B diversi sono uguali?

public class test
{
    public static void main()
    {
        String a = "boy";
        String b = "boy";

        if(a == b)
        {
            System.out.println("Equals!");
        }
        else
        {
            System.out.println("Does not equal!");
        }
    }
}
È stato utile?

Soluzione

Ciò è dovuto alla String internato .

Java (JVM) conserva una raccolta di letterali String che si usi per risparmiare memoria. Così, ogni volta che si crea un String in questo modo:

String s = "String";

'stagisti' Java la stringa. Tuttavia, se si crea la String in questo modo:

String s = new String("String");

Java non sarà automaticamente stagista il String. Se è stato creato le stringhe in questo modo, il codice produrrebbe risultati diversi.

Un rapido Google cercare rivela un sacco di buone risorse per quanto riguarda String internato.

Altri suggerimenti

In questo articolo vi spiegherà nei dettagli:

Qual è la differenza tra == e equals () in Java?

  

Dopo l'esecuzione di uno String =   "ragazzo"; la JVM aggiunge la   stringa “ragazzo” alla stringa   piscina e sulla riga successiva del codice,   incontri String b = “ragazzo” di nuovo; in questo caso la JVM già   sa che questa stringa è già   lì in piscina, in modo da non creare un   nuova stringa. Così entrambe le stringhe a e b puntano alla stessa stringa di ciò che significa che   scegliere lo stesso riferimento.

String a = "boy"; creerà un nuovo oggetto stringa con il valore ( "ragazzo"), posto nel pool di stringa e make a fare riferimento ad esso.

Quando l'interprete vede String b = "boy";, è prima controlla per vedere se string "boy" è presente nel pool di stringa, dal momento che è presente, non viene creato nessun nuovo oggetto e b è fatto per riferirsi allo stesso oggetto che a si riferisce.

Dal momento che entrambi i riferimenti contengono lo stesso contenuto passano il test di uguaglianza.

Dato che il tempo di esecuzione avrà un pool di stringa e quando è necessario assegnare una nuova stringa costante, l'aspetto fase di esecuzione all'interno della piscina, se il pool contiene, poi impostare il punto di variabili allo stesso oggetto String all'interno del piscina.

Ma non si dovrebbe mai dipende da questo per verificare la presenza di contenuto pari a corda. Si dovrebbe utilizzare il metodo: equals

Ogni volta che creiamo una stringa come di seguito:

String str1 = "abc";
String str2 = "abc";

JVM controllerà la str2 = "abc" nella piscina costante stringa, se è presente, allora wont creare una nuova stringa invece puntare alla stringa uno in piscina costante stringa.

Ma nel caso di questo String str = new String("abc"); sarà sempre creare un nuovo oggetto String ma possiamo usare la funzione intern() per forzare JVM di esaminare la piscina costante stringa.

Come giustamente spiegato in precedenza, nel caso del confronto '==', il runtime esaminerà la piscina String per l'esistenza della stringa. Tuttavia, è molto possibile che durante la raccolta dei rifiuti, o durante problemi di memoria, la macchina virtuale potrebbe distruggere il pool di stringa. L'operatore "==" Perciò potrebbe o non potrebbe restituire il valore corretto.

Lezione -. Sempre uso equals() per il confronto

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