Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
System.out.println("Le stringhe "+ a +" e "+ b +" sono lo stesso oggetto");
if(b.equalsIgnoreCase(a))
System.out.println("Le stringhe "+ a +" e "+ b +" hanno lo stesso valore");
}
Ottengo, stranamente, in output:
Le stringhe occhio e occhio sono lo stesso oggetto Le stringhe occhio e occhio hanno lo stesso valore
Se invece uso due stringhe diverse ("occhio" e "dente") giustamente non viene mostrato nulla in output.
La domanda è: perché se uso l'assegnazione nomevariabile = "valore" e se assegno sia ad a sia a b lo stesso valore, allora li considera come lo stesso oggetto (riferimento alla medesima locazione di memoria) ?
Ho anche notato che se uso invece a = new String("occhio") e b = new String("occhio"), il comportamento è diverso, cioé quello corretto, in quanto li considera come oggetti diversi, ma con ugual valore.
GRAZIE!!
Ultima modifica effettuata da bruno.demarini il 28/04/2013 alle 23:49
Probabilmente, per evitare spreco di memoria la jvm effettua dei controlli sulle stringhe temporanee create e quindi, nel caso ve ne siano due completamente identiche, non crea un'altra ma sfrutta la precedente; in poche parole utilizza una cache.
Cosa, che come hai detto, non accade con l'operatore new, in quanto dici in modo esplicito che vuoi della memoria nuova.
Penso sia questo il motivo, per essere sicuri bisognerebbe controllare sul sito della oracle.
Nel primo caso le due variabili non so uguali, perché una è "occhio" e l'altra è "OCchio" e quindi il primo controllo ritorna false, invece il secondo fa una cosa del genere "OCchio" lo trasforma in "occhio" controlla, e in effetti sono uguali e quindi ritorna true!
Invece nel secondo caso le due variabili sono uguali "occhio" e "occhio" quindi il primo controllo ritorna true e termina il programma!
Probabilmente, per evitare spreco di memoria la jvm effettua dei controlli sulle stringhe temporanee create e quindi, nel caso ve ne siano due completamente identiche, non crea un'altra ma sfrutta la precedente; in poche parole utilizza una cache.
Cosa, che come hai detto, non accade con l'operatore new, in quanto dici in modo esplicito che vuoi della memoria nuova.
Penso sia questo il motivo, per essere sicuri bisognerebbe controllare sul sito della oracle.
my 2 cents
Mmmh, questo mi sembra un comportamento interessante...! Grazie mille, ciao!!