0Pricing
Java Academy · Lezione

StringBuilder e StringBuffer a confronto

Compromessi sulla sicurezza dei thread

StringBuilder e StringBuffer a confronto è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Due classi mutabili

Java dispone di due classi mutabili per le stringhe: StringBuilder e StringBuffer. Le relative API sono quasi identiche, ma differiscono in un aspetto fondamentale: la sicurezza dei thread.

La stessa API

Entrambe le classi offrono append, insert, delete, reverse e gli altri metodi. Il codice che usa una delle due può generalmente passare all'altra modificando solo il nome del tipo.

public class Main {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("Hello").append(", ").append("World");
        System.out.println(sb);
    }
}

StringBuffer è sincronizzato

I metodi di StringBuffer sono synchronized, il che significa che più thread possono modificare in sicurezza la stessa istanza. Questa sicurezza comporta un lieve costo in termini di prestazioni.

public class Main {
    public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer("thread-safe");
        buffer.append("!");
        System.out.println(buffer);
    }
}

StringBuilder non è sincronizzato

StringBuilder evita la sincronizzazione, risultando più veloce. Lo svantaggio è che non è sicuro condividere una stessa istanza tra più thread senza un coordinamento esterno.

public class Main {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("fast");
        builder.append("!");
        System.out.println(builder);
    }
}

Quando usare StringBuilder

Utilizzi StringBuilder nel caso più comune: per creare stringhe all'interno di un singolo metodo o thread. È la scelta predefinita per quasi tutto il codice di uso quotidiano.

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            sb.append("#");
        }
        System.out.println(sb);
    }
}

Quando usare StringBuffer

Scelga StringBuffer solo quando la stessa istanza del builder è realmente condivisa e modificata da più thread. Nella pratica, è una situazione rara.

public class Main {
    public static void main(String[] args) {
        StringBuffer shared = new StringBuffer("log: ");
        shared.append("event A; ");
        shared.append("event B");
        System.out.println(shared);
    }
}

Le variabili locali non sono condivise

Un builder dichiarato e utilizzato solo all'interno di un metodo non è mai visibile agli altri thread, quindi StringBuilder è sempre appropriato in quel contesto. L'assenza di sincronizzazione non può causare problemi.

public class Main {
    static String build() {
        StringBuilder sb = new StringBuilder();
        sb.append("local only");
        return sb.toString();
    }
    public static void main(String[] args) {
        System.out.println(build());
    }
}

Differenza di prestazioni

Il sovraccarico della sincronizzazione in StringBuffer lo rende più lento in un contesto a thread singolo. Nei cicli stretti, StringBuilder offre prestazioni migliori.

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sb.append('x');
        }
        System.out.println("Built length: " + sb.length());
    }
}

Nota storica

StringBuffer è stato introdotto per primo, nelle prime versioni di Java. StringBuilder è stato aggiunto in Java 5 come alternativa più veloce e non sincronizzata per il comune caso d'uso a thread singolo.

Scegliere correttamente

Usi StringBuilder come scelta predefinita. Passi a StringBuffer solo quando può dimostrare che una singola istanza è condivisa tra più thread. In caso contrario, pagherebbe il costo di una sicurezza di cui non ha bisogno.

public class Main {
    public static void main(String[] args) {
        StringBuilder result = new StringBuilder();
        result.append("Use StringBuilder ").append("by default");
        System.out.println(result);
    }
}

Entrambe convertono in String

Entrambe le classi producono una String immutabile tramite toString(). La scelta tra le due influisce solo sulla costruzione, non sul risultato finale.

public class Main {
    public static void main(String[] args) {
        String a = new StringBuilder("one").toString();
        String b = new StringBuffer("two").toString();
        System.out.println(a + " " + b);
    }
}

Verifica rapida

Qual è la differenza principale tra StringBuilder e StringBuffer?

Riepilogo

Ha imparato a conoscere i compromessi:

  • Entrambe hanno API quasi identiche
  • StringBuffer è sincronizzato (sicuro per i thread, ma più lento)
  • StringBuilder è non sincronizzato (più veloce)
  • Usi StringBuilder come scelta predefinita per la costruzione a thread singolo
  • Usi StringBuffer solo per le istanze realmente condivise

Domande Frequenti

La lezione «StringBuilder e StringBuffer a confronto» è gratuita?

Sì — il testo completo di «StringBuilder e StringBuffer a confronto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «StringBuilder e StringBuffer a confronto»?

Compromessi sulla sicurezza dei thread Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «StringBuilder e StringBuffer a confronto»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché le stringhe sono immutabili
  2. Creare stringhe con StringBuilder
  3. Metodi di StringBuilder
  4. StringBuilder e StringBuffer a confronto
← Torna a Java Academy