Oppure

Loading
25/04/13 11:45
bruno.demarini
Ciao a tutti, vorrei sottoporvi questo listato che ho scritto io:
public static void main(String args[]){
        String a, b;
    
	a = "occhio";
	b = "OCchio";
	
	if (b == a)
	  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");
	
}


L'output che ottengo, prevedibilmente, è Le stringhe occhio e OCchio hanno lo stesso valore".

Se invece cambio il listato in questo modo, facendo coincidere i valori delle stringhe:

public static void main(String args[]){
        String a, b;
    
	a = "occhio";
	b = "occhio";
	
	if (b == a)
	  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 28/04/13 21:49
aaa
25/04/13 14:03
drinoda
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 :k:
aaa
25/04/13 14:42
LittleHacker
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! :k:
aaa
25/04/13 14:59
TheKaneB
@drinoda ha centrato la risposta corretta :k:
aaa
25/04/13 15:50
bruno.demarini
Postato originariamente da drinoda:

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 :k:


Mmmh, questo mi sembra un comportamento interessante...! Grazie mille, ciao!! :)
aaa
27/04/13 10:57
Qwertj
Immagino che in fase di compilazione vedendo due variabili uguali ne crei effettivamente una e l'altra la referenzi semplicemente a quella prima
aaa