Java Academy · Les

StringBuilder voor efficiënte concatenatie

Gebruik StringBuilder om binnen lussen en bij complexe opmaak efficiënt tekenreeksen op te bouwen.

Les 2 van 413 stappen

StringBuilder voor efficiënte concatenatie is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

StringBuilder voor efficiënt samenvoegen

StringBuilder is een veranderlijk alternatief voor String om tekst stapsgewijs op te bouwen. Het voorkomt dat er veel tussentijdse String-objecten worden aangemaakt.

StringBuilder tegenover String-samenvoeging

Wanneer je veel strings samenvoegt, vooral in lussen, is StringBuilder aanzienlijk sneller omdat het een interne tekenbuffer wijzigt in plaats van nieuwe objecten aan te maken.

// 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

StringBuilder-API

Belangrijke methoden: 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

append-aanroepen ketenen

Alle append-methoden en andere methoden die wijzigingen aanbrengen retourneren this, waardoor je aanroepen vloeiend kunt ketenen.

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());

Initiële capaciteit

Geef StringBuilder vooraf de verwachte capaciteit om het opnieuw vergroten van de interne array te voorkomen. Dit verbetert de prestaties bij grote strings.

// 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 en gerichte verwijderingen

deleteCharAt verwijdert één teken. delete(start, end) verwijdert een bereik. Deze bewerkingen zijn O(n) doordat de array moet worden verschoven.

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!

CSV opbouwen

Een praktisch patroon: een CSV-regel opbouwen met StringBuilder en de scheidingstekens correct afhandelen.

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 voor uitvoer met scheidingstekens

StringJoiner vereenvoudigt het samenvoegen van elementen met een scheidingsteken, een optioneel voorvoegsel en achtervoegsel — handmatige afhandeling van scheidingstekens is niet nodig.

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 tegenover StringBuffer

StringBuffer is de threadveilige, gesynchroniseerde versie van StringBuilder. Deze is trager door de vergrendeling. Gebruik StringBuilder in contexten met één thread, dus in 99% van de gevallen.

// 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

Omkeren en palindromen controleren

Met de ingebouwde reverse() van StringBuilder wordt het controleren op palindromen elegant.

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

Praktisch: SQL-querybouwer

Een dynamische SQL-query opbouwen met StringBuilder, waarbij WHERE-clausules voorwaardelijk worden toegevoegd.

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

Korte controle

Waarom is het samenvoegen van strings met + inefficiënt in lussen?

Samenvatting: StringBuilder voor efficiënt samenvoegen

Belangrijkste punten:

  • StringBuilder is veranderlijk — append/insert/delete wijzigen een interne buffer
  • Gebruik StringBuilder in lussen om het aanmaken van O(n²) String-objecten te voorkomen
  • Alle methoden die wijzigingen aanbrengen retourneren this — daardoor kun je aanroepen vloeiend ketenen
  • Geef StringBuilder vooraf de verwachte capaciteit om het opnieuw vergroten van de interne buffer te beperken
  • StringJoiner en String.join zijn handig voor uitvoer met scheidingstekens
  • StringBuffer is het gesynchroniseerde, dus threadveilige, maar tragere alternatief
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “StringBuilder voor efficiënte concatenatie” gratis?

Ja — de volledige tekst van “StringBuilder voor efficiënte concatenatie” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “StringBuilder voor efficiënte concatenatie”?

Gebruik StringBuilder om binnen lussen en bij complexe opmaak efficiënt tekenreeksen op te bouwen. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “StringBuilder voor efficiënte concatenatie”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Onveranderlijkheid van String en de String-pool
  2. StringBuilder voor efficiënte concatenatie
  3. Tekstblokken en String.format
  4. Reguliere expressies met Pattern en Matcher
← Terug naar Java Academy