In Java, la classe String è immutabile: ogni operazione di modifica crea un nuovo oggetto. Le classi StringBuilder e StringBuffer sono mutabili e vengono utilizzate per la concatenazione all'interno di cicli e trasformazioni complesse.
Differenze chiave:
String: immutabile, thread-safe senza sincronizzazione aggiuntiva. Ideale per testo leggibile e immutabile (ad esempio, chiavi, messaggi).StringBuilder: mutabile, non thread-safe, ma concatenazione veloce. Utilizzato dove le stringhe vengono modificate molte volte.StringBuffer: mutabile, thread-safe (metodi sincronizzati), ma inferiore in prestazioni rispetto a StringBuilder.Esempio di confronto delle prestazioni:
String s = ""; for (int i = 0; i < 10000; i++) { s += i; // crea ogni volta una nuova String, lento! } // Meglio così: StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString();
Insidie:
String.intern() può causare OutOfMemoryError in PermGen/Metaspace con un gran numero di stringhe uniche.Domanda: "La concatenazione di stringhe con l'operatore "+" all'interno di un ciclo è efficiente?"
Risposta: No, ogni volta viene creato un nuovo oggetto String, il che grava pesantemente sulla memoria e sul GC. Per molte operazioni è meglio usare StringBuilder o StringBuffer (se è necessaria la sicurezza dei thread).
Esempio:
String s = ""; for (int i = 0; i < 1000; i++) { s += i; // ESTREMAMENTE inefficiente! } // vs StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); }
Storia
In un progetto bancario, la concatenazione di stringhe usando l'operatore "+" in un grande ciclo ha rallentato l'analisi notturna di 15 volte. Il problema è stato risolto sostituendo con StringBuilder, il tempo di esecuzione è passato da 40 minuti a 2.
Storia
Un giovane sviluppatore ha commesso un errore con i thread e ha usato StringBuilder nello stesso oggetto facciata, a cui accedevano contemporaneamente più thread. Ciò ha portato a glitch casuali e risultati errati a causa della mancanza di sincronizzazione.
Storia
In un progetto venivano create etichette uniche usando String.intern(). Con l'aumento degli utenti a decine di milioni, la JVM ha iniziato a generare OutOfMemoryError: PermGen space. Hanno deciso di abbandonare l'uso di intern() e di passare ad altri meccanismi di caching.