Newsgroup: it.comp.java
Titolo: Re: caso in cui usare StringBuffer

 grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Dunque sto facendo unpo' di confusione
Se io scrivo
String h= "www" + "qqq" + "rrr" + "xxx"?
creo 5 oggetti stringa (h + le 4 costanti stringa)?
mentre se scrivo
StringBuffer x = "www";
x.append( "qqq"); 
x.append( "rrr"); 
x.append( "xxx"); 
String h = x.toString(); 
ho 2 oggetti(x e h)?
conviene quindi la seconda soluzione(a livello di performance e
soprattutto quando bisogna aggiungere tante stringhe)??
grazie


forse ho trovato:
http://www.javaworld.com/javaworld/jw-03-2000/jw-0324-javaperf.html


 in che senso migliora la performance???(siate semplici eh)
Molto semplice. String è un oggetto immodificabile, ovvero tu non hai 
nessun metodo per modificarne il contenuto. Qualsiasi operazione di 
concatenazione, substring, estrazione, etc... genera un nuovo oggetto.
StringBuffer viceversa ha dei metodi appositi per effettuare le 
operazioni nel buffer prima di avere il risultato come String.

 diana_est wrote:


ok mi son letto anche quell'articolo.
ma quindi quando scrivo
String k="qqq"+"Www"+"aaa"+"sss";
ogni  operazione di concatenazione crea un nuovo oggetto(in questo caso
4)???
per assurdo allora se scrivo
String j1="qqq";
String j2="Www";
String j3="aaa";
String j4="sss";
String k=j1+j2+j3+j4;
oltre ai 4 oggetti(j1,j2,j3,j4) mi vengono creati altri 4 oggetti
derivanti dalla concatenazione ?


 soprattutto quando bisogna aggiungere tante stringhe)??
Solo una precisazione: dal JDK5 meglio usare StringBuilder, che è ancora 
più performante di StringBuffer in quanto non sincronizzata.
pole
-- 
ammentos - a lightweight persistence framework for JDK5
http://www.sourceforge.net/projects/ammentos
http://ammentos.biobytes.it

 pole
ok grazie ma richiedo:
quando scrivo
String k="qqq"+"Www"+"aaa"+"sss";
ogni operazione di concatenazione crea un nuovo oggetto(in questo caso
4)???
per assurdo allora se scrivo
String j1="qqq";
String j2="Www";
String j3="aaa";
String j4="sss";
String k=j1+j2+j3+j4;
oltre ai 4 oggetti(j1,j2,j3,j4) mi vengono creati altri 4 oggetti
derivanti dalla concatenazione ?
grazie


 4)???
L'overload dell'operatore + nel caso delle stringhe è effettuato 
attraverso l'utilizzo di StringBuffer (o StringBuilder).
Quindi ogni volta che scrivi
String c = a + b;
è come se facessi
String c = new StringBuilder( a ).append( b );
Nel caso di molte concatenazioni successive questo può causare un 
degrado non indifferente delle prestazioni per via della continua 
allocazione/deallocazione di oggetti StringBuilder.
A seconda dei casi il compilatore potrebbe essere in grado di 
ottimizzare i vari casi (per esempio riutilizzando lo stesso 
StringBuilder - la java language specification lascia libero questo 
punto), ma certamente utilizzando in partenza un unico StringBuilder vai 
sul sicuro ;-)


 pole
scusa se rompo ancora(per ora lasciamo perdere StringBuilder  e
consideriamo solo StringBuffer)
Scrivendo qualcosa del genere dunque:
String j1="qqq";
String j2="Www";
String j3="aaa";
String j4="sss";
String k=j1+j2+j3+j4;
rischio che quando faccio la concatenazione potrebbero essere
allocati/disallocati vari oggetti StringBuffer giusto?
mentre se faccio 
String j1="qqq";
String j2="Www";
String j3="aaa";
String j4="sss";
StringBufferk=new
StringBuffer().append(j1).append(j2).append(j3).append(j4)
Viene allorcato un unico StringBuffer vero(ed è per questo che ottimizzo)??
poi chiedo: quando nel primo caso faccio:
String k=j1+j2+j3+j4;
non mi viene creato(per ogni operazione concatenazione) un nuovo oggetto
stringa o si?
grazie infinite


Ma attaccarsi a un debugger e vedere cosa succedere invece di ripetere la
stessa domanda X volte e' troppo complesso? :-)
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it

 stringa o si?
Ancora: dipende dall'implementazione della JVM.
L'articolo di cui sopra comunque riporta:
" a Java compiler is not required to optimize an expression such as:
     str1 + str2 + str3 + ...
"
ovvero, la JVM potrebbe o meno ottimizzare (per esempio utilizzando uno 
stringbuffer unico), ma siccome non è *obbligatorio*...
Oltre a questo articolo ti consiglio la Java Language Specification, 
scaricabile da qui:
http://java.sun.com/docs/books/jls/


 stessa domanda X volte e' troppo complesso? :-)
ok scusa, cerchero' cosa è un debugger


 ok scusa, cerchero' cosa è un debugger
o meglio, cosa è lo so, cerchero' un debugger


 pole
grazie , cmq quando scrivo
String k=j1+j2+j3+j4;
penso proprio che non mi venga creato(per ogni operazione di
concatenazione) un nuovo oggetto Stringa (indipendentemente dallo
StringBuffer)
ciao e grazie


 o meglio, cosa è lo so, cerchero' un debugger
   Stavo per ucciderti :-)
Se usi Eclipse sei a posto, c'e' tutto.


 Se usi Eclipse sei a posto, c'e' tutto.
ok


 StringBuffer)
Beh, se č il tuo parere ciň che per te conta, effettivamente mi sfugge 
il senso di tutte queste domande...


 pole
ma no non č il mio parere.
come dice Francesco č meglio mettermi a fare delle prove ma intanto, dalle
tue risposte, mi pare d'aver capito che scrivendo 
String k=j1+j2+j3+j4;
si rischia di allocare/disallocare vari StringBuffer ma non che non mi
venga creato(per ogni operazione di concatenazione) un nuovo oggetto
Stringa
forse ho capito male, cmq scusa non volevo offenderti


 > > StringBuffer)
e cmq tue risposte sono state utilissime, grazie


 forse ho capito male, cmq scusa non volevo offenderti
Ma che offesa figurati :))
Intendo dire che la documentazione ufficiale _non specifica_ cosa accade 
(creazione di nuove stringhe, stringbuffer etc.). Ciň significa che 
anche debuggando saprai soltanto cosa succede sulla *tua* JVM. Se vuoi 
fare qualcosa che *dappertutto* funzioni sicuramente come vuoi tu allora 
dovresti usare StringBuffer/Builder.


 pole
ok grazie mille, allora evito anche di debuggare(scherzo eh, appena ho
tempo lo faccio :-))
ciao
