[Soci SLIP] Re: [java] stringhe uguali?

Lucio Crusca lucio a sulweb.org
Lun 2 Apr 2012 13:57:46 CEST


In data lunedì 2 aprile 2012 13:07:03, Enrico Agliotti ha scritto:
> mi rispondo da solo.

Ti rispondo anch'io, dato che nella tua risposta ho notato qualche 
imprecisione.

> Le due espressioni sono equivalenti ma due stringhe letterali uguali
> sono create da java come un oggetto solo e quindi i due reference a e
> b puntano allo stesso oggetto e sono di fatto uguali, però non bisogna
> fidarsi.

Fin qui tutto ok.

> Tant'è vero che questo non funziona di nuovo più:
> 
> class TestString {
>   public static void main(String[] args) {
>     String a1 = "ci";
>     String a2 = "ao";
>     String a = a1 + a2;
>     String b = "ciao";
>     if (a==b) {
>       System.out.println("uguali");
>     }
>   }
> }

Questo esempio invece è fuorviante. La stringa a contiene certamente il valore 
"ciao", ma non è una literal (ovvero il valore "ciao" per quella stringa non è 
disponibile a tempo di compilazione). Di conseguenza il compilatore non può 
sapere che la stringa a contiene lo stesso valore della stringa b, quindi non 
può creare due riferimenti allo stesso oggetto in memoria. Questo perché 
l'operatore "+" è di fatto una funzione che viene eseguita runtime e che, 
espansa nel codice equivalente, sarebbe:

String a = new StringBuffer(a1).append(a2).toString();

In memoria vengono creati oggetti diversi dalla stringa b, anche se poi alla 
fine la stringa a conterrà lo stesso valore.

Il modo normale in Java di confrontare due stringhe è

if (a.equals(b)) ...

che confronta i contenuti delle stringhe e non il valore del riferimento 
all'oggetto in memoria (che sarebbe qualcosa di simile al puntatore in C).





Maggiori informazioni sulla lista Soci