0Pricing
Java Academy · Lezione

StringBuilder per concatenazioni efficienti

Utilizzi StringBuilder per costruire stringhe in modo efficiente all'interno di cicli e formattazioni complesse.

StringBuilder per concatenazioni efficienti è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 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.

StringBuilder per una concatenazione efficiente

StringBuilder è un'alternativa mutabile a String per creare testo in modo incrementale. Evita di creare numerosi oggetti String intermedi.

StringBuilder rispetto alla concatenazione delle String

Quando concatena molte stringhe, soprattutto nei cicli, StringBuilder è notevolmente più veloce perché modifica un buffer interno di caratteri invece di creare nuovi oggetti.

// Inefficient: creates a new String every iteration
String result = "";
for (int i = 0; i < 1000; i++) {
    result += i + ","; // 1000 new String objects!
}

// Efficient: StringBuilder uses a resizable char buffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i).append(',');
}
String efficient = sb.toString(); // one final String created

API di StringBuilder

Metodi principali: append, insert, delete, replace, reverse, toString, length, charAt, setCharAt.

StringBuilder sb = new StringBuilder("Hello");

sb.append(", World");     // Hello, World
sb.insert(5, "!");        // Hello!, World
sb.delete(5, 6);           // Hello, World
sb.replace(7, 12, "Java"); // Hello, Java
sb.reverse();               // avaJ ,olleH
sb.reverse();               // Hello, Java

System.out.println(sb);         // Hello, Java
System.out.println(sb.length()); // 11
System.out.println(sb.charAt(0)); // H

Concatenare chiamate a append

Tutti i metodi append e gli altri metodi che modificano l'oggetto restituiscono this, consentendo di concatenare le chiamate in modo fluente.

StringBuilder html = new StringBuilder()
    .append("<div class=\"card\">")
    .append("<h2>").append("Product Title").append("</h2>")
    .append("<p>Price: $").append(String.format("%.2f", 29.99)).append("</p>")
    .append("<button>Add to Cart</button>")
    .append("</div>");

System.out.println(html.toString());

Capacità iniziale

Imposti in anticipo StringBuilder con la capacità prevista per evitare il ridimensionamento dell'array interno e migliorare le prestazioni con le stringhe di grandi dimensioni.

// Default capacity: 16 chars
StringBuilder small = new StringBuilder();

// Pre-sized: 10 items * ~50 chars each
StringBuilder report = new StringBuilder(500);

for (int i = 1; i <= 10; i++) {
    report.append(String.format("%-3d. Record %04d: processed OK%n", i, i));
}

System.out.println(report.toString().substring(0, 30));
// "  1. Record 0001: processed OK"

deleteCharAt e rimozioni specifiche

deleteCharAt rimuove un singolo carattere. delete(start, end) rimuove un intervallo. Queste operazioni hanno complessità O(n) a causa dello spostamento degli elementi nell'array.

StringBuilder sb = new StringBuilder("Hello, World!");

sb.deleteCharAt(5);     // removes comma: "Hello World!"
sb.delete(5, 6);         // removes space: "HelloWorld!"

System.out.println(sb); // HelloWorld!

// Replace to fix a typo
StringBuilder typo = new StringBuilder("Helo, Java!");
typo.replace(typo.indexOf("Helo"), typo.indexOf("Helo") + 4, "Hello");
System.out.println(typo); // Hello, Java!

Creare un CSV

Un approccio pratico: creare una riga CSV con StringBuilder gestendo correttamente i separatori.

import java.util.List;

static String toCsv(List<String> values) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < values.size(); i++) {
        if (i > 0) sb.append(',');
        sb.append(escapeCsv(values.get(i)));
    }
    return sb.toString();
}

static String escapeCsv(String s) {
    if (s.contains(",") || s.contains("\""))
        return "\"" + s.replace("\"", "\"\"") + "\"";
    return s;
}

System.out.println(toCsv(List.of("Alice", "Smith, Jr.", "30")));
// Alice,"Smith, Jr.",30

StringJoiner per output separati da delimitatori

StringJoiner semplifica l'unione di elementi con un delimitatore, un prefisso e un suffisso opzionali: non è necessario gestire manualmente i separatori.

import java.util.StringJoiner;

StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice");
sj.add("Bob");
sj.add("Charlie");
System.out.println(sj.toString()); // [Alice, Bob, Charlie]

// Equivalent with String.join
String joined = String.join(", ", "Alice", "Bob", "Charlie");
System.out.println(joined); // Alice, Bob, Charlie

// Streams: collect with joining collector
import java.util.stream.*;
List.of("a", "b", "c").stream()
    .collect(Collectors.joining(", ", "(", ")"));
// (a, b, c)

StringBuilder rispetto a StringBuffer

StringBuffer è la versione sincronizzata e sicura per i thread di StringBuilder. È più lento a causa dei lock. Utilizzi StringBuilder nei contesti a singolo thread (nel 99% dei casi).

// StringBuffer: thread-safe but slower (synchronized methods)
StringBuffer buf = new StringBuffer();
buf.append("Thread-safe");
buf.append(" but slow");

// StringBuilder: not thread-safe but faster
StringBuilder sb = new StringBuilder();
sb.append("Fast");
sb.append(" single-threaded");

// When to use StringBuffer:
// - Multiple threads write to the same buffer
// - Almost always a design smell — redesign to avoid sharing

Invertire una stringa e verificare un palindromo

Il metodo reverse() integrato in StringBuilder rende elegante la verifica dei palindromi.

static boolean isPalindrome(String s) {
    String cleaned = s.toLowerCase()
        .replaceAll("[^a-z0-9]", ""); // remove non-alphanumeric
    String reversed = new StringBuilder(cleaned).reverse().toString();
    return cleaned.equals(reversed);
}

System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("race a car"));                      // false
System.out.println(isPalindrome("Was it a car or a cat I saw?"));    // true

Nel mondo reale: generatore di query SQL

Creare una query SQL dinamica con StringBuilder, aggiungendo in modo condizionale le clausole where.

static String buildQuery(String category, Double minPrice, Double maxPrice) {
    StringBuilder sql = new StringBuilder("SELECT * FROM products WHERE 1=1");
    if (category != null)
        sql.append(" AND category = '" + category + "'");
    if (minPrice != null)
        sql.append(" AND price >= ").append(minPrice);
    if (maxPrice != null)
        sql.append(" AND price <= ").append(maxPrice);
    sql.append(" ORDER BY name");
    return sql.toString();
}

System.out.println(buildQuery("Electronics", 50.0, null));
// SELECT * FROM products WHERE 1=1 AND category = 'Electronics' AND price >= 50.0 ORDER BY name

Verifica rapida

Perché la concatenazione delle stringhe con + è inefficiente nei cicli?

Riepilogo: StringBuilder per una concatenazione efficiente

Punti chiave:

  • StringBuilder è mutabile: append/insert/delete modificano un buffer interno
  • Utilizzi StringBuilder nei cicli per evitare la creazione di stringhe con complessità O(n²)
  • Tutti i metodi che modificano l'oggetto restituiscono this, consentendo di concatenare le chiamate in modo fluente
  • Imposti StringBuilder con la capacità prevista per ridurre il ridimensionamento interno
  • StringJoiner e String.join sono pratici per creare output separati da delimitatori
  • StringBuffer è l'alternativa sincronizzata (sicura per i thread), ma più lenta

Domande Frequenti

La lezione «StringBuilder per concatenazioni efficienti» è gratuita?

Sì — il testo completo di «StringBuilder per concatenazioni efficienti» è 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 per concatenazioni efficienti»?

Utilizzi StringBuilder per costruire stringhe in modo efficiente all'interno di cicli e formattazioni complesse. 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 2 di 4.

Quanto tempo richiede la lezione «StringBuilder per concatenazioni efficienti»?

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. Immutabilità di String e string pool
  2. StringBuilder per concatenazioni efficienti
  3. Text block e String.format
  4. Espressioni regolari con Pattern e Matcher
← Torna a Java Academy