PDA

Visualizza la versione completa : [JAVA] String e StringBuffer


SkOrPiOn`87
12-10-2005, 16:49
Ciao, sto cercando di capire il funzionamento delle stringhe...

Il mi libro dice che le stringhe sono oggetti immutabili, che una volta creati non possono più essere modificati. Gli stringBuffer invece possono mutare, e se il testo che ci immettiamo è più grande di quanto potrebbe essere il compilatore aggiunge in autoamtico i byte per completare la stringa...

Allora per fare una prova ho scritto questo programma:



import javax.swing.*;


public class stringhe {

public static void main(String[] args) {

String s1 = "ciao";
String output = "s1: " + s1;
s1 = "ss";
JOptionPane.showMessageDialog(null, output, "Sskdn", JOptionPane.INFORMATION_MESSAGE);

s1 = "ssaafR";
output = "s1: " + s1;
JOptionPane.showMessageDialog(null, output, "Sskdn", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}

}


Il primo output stampa Ciao (4lettere), mentre il secondo stampa ssaafR (6 lettere)?

Ma appena tentao di cambiare un carattere non doveva darmi errore?
In questo modo mi sembra che String e StringBuffer siano la stessa cosa... no?

Grazie :ciauz:

stai_tranquillo
12-10-2005, 17:13
la differenza è invisibile al programmatore:

mi spiego meglio,


String aa = "CIAO";

aa += " PIPPO";

mi produce "CIAO PIPPO";


il programma in realtà CREA un oggetto String con valore "CIAO",

poi CREA un altro oggetto String con valore "CIAO PIPPO"

in totale, ha istanziato 2 oggetti.


con lo StringBuffer, qualsiasi modifica si ripercuote sullo STESSO oggetto, pertanto in metodi che iterano molto, e che hanno bisogno di modificare stringhe con latenze basse e rispario di memoria è opportuno utilizzare gli StringBuffer.

SkOrPiOn`87
12-10-2005, 17:20
quindi possiamo dire che quando aa cambia valore viene prima distrutto e poi riallocata la memoria necessaria alla nuova stringa?

stai_tranquillo
12-10-2005, 17:25
potenzialmente,
se la gc funzionasse ad azione immediata,
se sfondassi il tetto della memoria con la creazione della nuova stringa,

direi di si.

poi in realtà non viene distrutto niente, perde solo il riferimento ma ti ripeto: sono cose invisibili al programmatore.


comunque in termini pratici è così: lo stringbuffer lavora sempre sullo stesso oggetto, lo String crea nuovi oggetti ad ogni modifica del contenuto.

Loading