[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