Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Comportamento strano stringhe, equals, == [RISOLTO]
Forum - Java - Comportamento strano stringhe, equals, == [RISOLTO]

Avatar
bruno.demarini (Normal User)
Pro


Messaggi: 84
Iscritto: 22/03/2010

Segnala al moderatore
Postato alle 13:45
Giovedì, 25/04/2013
Ciao a tutti, vorrei sottoporvi questo listato che ho scritto io:
Codice sorgente - presumibilmente Java

  1. public static void main(String args[]){
  2.         String a, b;
  3.    
  4.         a = "occhio";
  5.         b = "OCchio";
  6.        
  7.         if (b == a)
  8.           System.out.println("Le stringhe " + a + " e " + b + " sono lo stesso oggetto");
  9.        
  10.         if (b.equalsIgnoreCase(a))
  11.           System.out.println("Le stringhe " + a + " e " + b + " hanno lo stesso valore");
  12.        
  13. }



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:

Codice sorgente - presumibilmente Java

  1. public static void main(String args[]){
  2.         String a, b;
  3.    
  4.         a = "occhio";
  5.         b = "occhio";
  6.        
  7.         if (b == a)
  8.           System.out.println("Le stringhe " + a + " e " + b + " sono lo stesso oggetto");
  9.        
  10.         if (b.equalsIgnoreCase(a))
  11.           System.out.println("Le stringhe " + a + " e " + b + " hanno lo stesso valore");
  12.        
  13. }



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
PM Quote
Avatar
drinoda (Normal User)
Newbie


Messaggi: 8
Iscritto: 08/04/2013

Segnala al moderatore
Postato alle 16:03
Giovedì, 25/04/2013
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:

PM Quote
Avatar
LittleHacker (Member)
Guru


Messaggi: 1033
Iscritto: 28/04/2009

Segnala al moderatore
Postato alle 16:42
Giovedì, 25/04/2013
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:

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 16:59
Giovedì, 25/04/2013
@drinoda ha centrato la risposta corretta :k:

PM Quote
Avatar
bruno.demarini (Normal User)
Pro


Messaggi: 84
Iscritto: 22/03/2010

Segnala al moderatore
Postato alle 17:50
Giovedì, 25/04/2013
Testo quotato

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!! :)

PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 12:57
Sabato, 27/04/2013
Immagino che in fase di compilazione vedendo due variabili uguali ne crei effettivamente una e l'altra la referenzi semplicemente a quella prima

PM Quote