Lezione di Java 27 – L’oggetto String e StringBuffer

Indice Lezione PrecedenteLezione Successiva


La gestione delle stringhe in Java comporta un dispendio molto oneroso delle risorse del sistema, per questo motivo si è deciso di creare la Java Literal Pool. Questa “piscina” ha il compito di contenere le stringhe che vengono utilizzate all’interno del nostro programma, se viene creata un stringa già presente nella Java Literal Pool non verrà allocata nuova memoria, semplicemente si farà riferimento all’oggetto già esistente. Per evitare problemi tramite la modifica di stringhe con riferimenti multipli, è stato deciso di renderle immutabili. Facciamo qualche esempio:

String s1 = "Java"; // Pone l'oggetto nella JLP
String s2 = s1; // Copia il riferimento. Equivalente a String s2 = "Java"
s2 = s2.concat("C++"); // Viene creato un nuovo oggetto "JavaC++"
System.out.println(s1); // Output: Java
System.out.println(s2); // Output: JavaC++

Non tutte le stringhe finiscono nella JLP, vediamo un altro esempio:

String s1 = "Java";
String s2 = "Java";
if ( s1 == s2 ) System.out.println("true"); // Puntano allo stesso oggetto, "true"
else System.out.println("false");

String s3 = new "Java";
if ( s1 == s3 ) System.out.println("true"); // E' stato utilizzato l'operatore new, sono oggetti differenti
else System.out.println("false"); // Stamperemo "false"

Come si può notare, quando viene utilizzato l’operatore new per una stringa, nonostante il contenuto sia uguale, verrà creato un nuovo oggetto. Questo nuovo oggetto si troverà al di fuori della Java Literal Pool, ciò comprota anche una differente possiblità di essere eletto dalla Garbage Collector. Gli oggetti presenti nella JLP hanno sempre un riferimento valido da parte della JLP, essendoci questo riferimento non potranno essere eletti dalla GC! Per maggiori informazioni: The SCJP Tip Line (in inglese).

StringBuffer

Se vogliamo modificare una stringa, Java ci mette a disposizione un altra classe, la classe StringBuffer. Questo tipo di classe permette la modifica dell’oggetto stringa. Riprendiamo il primo esempio visto ad inizio lezione, avremo:

StringBuffer s1 = "Java"; // Pone l'oggetto nella JLP
StringBuffer s2 = s1; // Copia il riferimento
s2 = s2.concat("C++"); // Concatena la stringa "C++" nello stesso oggetto
System.out.println(s1); // Output: JavaC++
System.out.println(s2); // Output: JavaC++

Ti piace l’articolo?
Diventa fan su Facebook
Indice Lezione PrecedenteLezione Successiva
Pubblicato in Guide, Guide, Java, Programmazione Taggato con: , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*