Newsgroup: it.comp.java
Titolo: [help]confronto vb-java sulle stringhe

scusate l'orrendo multi post (it.comp.lang.visulal-basic e
it.comp.java)
ma la questione riguarda ambedue i ng.
dal libro "visual basic 2010 " spiegato a mia  nonna di Mario De
Ghetto
(pg. 435)
...questo è dovuto alla particolarità dei tipi stringa: le variabili
sono differenti,ma i valori confluiscono nella stessa posizione in
memoria e, quindi, il riferimento è comune (a parità di valore di
stringa)
quindi
se ho
Dim str1 As String="prova"
Dim str2 As Strin="prova"
str1=str2
per quanto riguarda Java invece, i valori non confluiscono nella
stessa posizione in memoria giusto?
thanks, ciao, Jasmine
--
Wataya Noboru non doveva difendere nulla.Per questo 
poteva concentrare tutti i suoi sforzi nella conduzione
pura e semplice della battaglia. 
L'uccello che girava le viti del mondo,Murakami Haruki

 wrote:
'str1=str2
ops, non sono uguali; intendevo che puntano allo stesso valore


str1=str2 copia il contenuto di str2 in str1. Però gli oggetti sono 
oggetti distinti. Per intenderci è una copia per valore e non per indirizzo.
Se provi questo codice dovrebbe esserti tutto più chiaro.
String str1 = "str1";
String str2 = "str2";
System.out.println(str1 + " - "+ str2);
str1 = str2;
System.out.println(str1 + " - "+ str2);
str1 = str2.toUpperCase();
System.out.println(str1 + " - "+ str2);
str1 = "nuova str1";
System.out.println(str1 + " - "+ str2);
Per comodità ti riporto il risultato in standard output
str1 - str2
str2 - str2
STR2 - str2
nuova str1 - str2



thanks, sto studiando sia java che vb e sulle stringhe faccio
una confusione incredibile, perchè mi sembra che vb
sia diverso da (in questo) da tutti gli altri linguaggi
mi mette in crisi anche quello che avevo appreso
su altri linguaggi


 stessa posizione in memoria giusto?
sbagliato.
java supporta il cosiddetto "interning" delle stringhe in modo
automatico: in pratica la classe String mantiene una tabella statica
di stringhe e per salvare spazio ciascuna istanza restituisce (tramite
il metodo intern() per le istanze non literal) un riferimento
all'elemento della tabella. ciò è possibile perché gli oggetti di tipo
String sono immutabili.
dimostrazione pratica:
String p = "prova";
String p1 = "pro"+"va";
String p2 = new String("pro"+"va");
System.out.println(p == p1); //true
System.out.println(p == p2); //false
System.out.println(p == p2.intern()); //true


azzo, anche qui.!!!
non ho capito niente delle stringhe in Java :(((
grazie, ciao


 System.out.println(p == p1); //true
Tutte le stringhe literal appartengono alla stessa istanza di String (o 
quantomeno condividono la tabella statica)?

 quantomeno condividono la tabella statica)?
in realtà tutte le stringhe condividono la tabella. le literal hanno
la particolarità che la reference corrisponde a quella intern
(fondamentalmente perché sono note a compile time).

System.out.println(p == p2.intern()); //true
p.equals(p2) == true
Il fatto è che == confronta la posizione in memoria. _Di solito_,
però, per quel che riguarda le stringhe, non sei interessato al fatto
che due stringhe condividano la medesima posizione in memoria, ma che
abbiano lo stesso contenuto. Il metodo equals() si riferisce al
contenuto (nota che le classi possono (e in genere lo fanno)
ridefinire il metodo equals)
Un altro es interessante è
		String xA = "xA";
		String Ax = "Ax";
		System.out.println(xA.substring(1, 2) + " " + Ax.substring(0, 1)); //
A A
		System.out.println(xA.substring(1, 2) == Ax.substring(0, 1));      //
false
		System.out.println(xA.substring(1, 2).equals(Ax.substring(0, 1))); //
true
In questo caso xA e Ax sono due stringhe chiaramente differenti. Per
cui dovrà essere OVVIAMENTE differente la zona in memoria. Il metodo
Substring ritorna un nuovo oggetto, ma per motivi di risparmio di
memoria, l'array di char è il medesimo dell'oggetto originario, solo
che in una variabile (dentro la strigna) di offset c'è scritto che
tutte le operazioni sono 'spostate'. Per cui xA contiene l'array x,A e
offset iniziale = 0, xA.substring(1, 2) contiene lo stesso array x,A e
offset iniziale 1, per cui quando per es chiedi l'N-simo carattere, ti
viene tornato l'N+offset carattere dell'array.
in questo contesto, è ovvio che gli oggetti sono completamente
differenti [xA.substring(1, 2) contiene x,A e offset da 1 a 2,
Ax.substring(0, 1) contiene A,x e offset da 0 a 1]. Ma il _contenuto_,
per entrambi è "A". Essendo il contenuto uguale, equals() ritorna
true.
MORALE: se vuoi testare che due variabili contengano lo stesso
oggetto, usa ==. Se vuoi testare che due variabili contengano oggetti
uguali, usa equals(). Due stringhe uguali non sono necessariamente lo
stesso oggetto.

 originario
Molto chiaro e utile, grazie.

 ridefinire il metodo equals)
la mia era più una disquisizione "accademica" che una questione
pratica. resta fermo il fatto che per verificare l'uguaglianza
semantica di due oggetti *deve* essere usato il metodo equals().

stesso oggetto.
grazie, ora mi è chiaro, perchè mi è stato detto di non usare
per le stringhe == come si fa per c++
ciao, Jasmine
