Java Academy · Oppitunti

StringBuilder tehokkaaseen yhdistämiseen

Käytä StringBuilderia merkkijonojen tehokkaaseen rakentamiseen silmukoissa ja monimutkaisessa muotoilussa.

Oppitunti 2/413 vaihetta

StringBuilder tehokkaaseen yhdistämiseen on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

StringBuilder tehokkaaseen yhdistämiseen

StringBuilder on muuttuva vaihtoehto String-oliolle tekstin rakentamiseen vaiheittain. Se välttää useiden väliaikaisten String-olioiden luomisen.

StringBuilder verrattuna merkkijonojen yhdistämiseen

Kun useita merkkijonoja yhdistetään, erityisesti silmukoissa, StringBuilder on huomattavasti nopeampi, koska se muuttaa sisäistä merkkipuskuria uusien olioiden luomisen sijaan.

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

Tärkeimmät metodit: 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-kutsujen ketjuttaminen

Kaikki append- ja muut muuttavat metodit palauttavat this-arvon, mikä mahdollistaa sujuvan metodiketjutuksen.

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

Alkuperäinen kapasiteetti

Alustakaa StringBuilder odotetulla kapasiteetilla, jotta sisäisen taulukon kokoa ei tarvitse muuttaa ja suurten merkkijonojen käsittely tehostuu.

// 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 ja kohdennetut poistot

deleteCharAt poistaa yhden merkin. delete(start, end) poistaa merkkialueen. Nämä operaatiot ovat O(n), koska taulukon sisältöä siirretään.

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-tiedoston rakentaminen

Käytännöllinen ohjelmointimalli: CSV-rivin rakentaminen StringBuilderilla ja erottimien asianmukainen käsittely.

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 erotinmerkillä erotettuun tulosteeseen

StringJoiner helpottaa alkioiden yhdistämistä erottimen sekä valinnaisen alku- ja loppuosan avulla — erottimia ei tarvitse käsitellä manuaalisesti.

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 verrattuna StringBufferiin

StringBuffer on StringBuilderin säieturvallinen ja synkronoitu versio. Se on lukituksen vuoksi hitaampi. Käyttäkää StringBuilderia yksisäikeisissä tilanteissa, joita on valtaosa tapauksista.

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

Käänteinen merkkijono ja palindromin tarkistus

StringBuilderin sisäänrakennettu reverse()-metodi tekee palindromien tarkistamisesta eleganttia.

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

Käytännön esimerkki: SQL-kyselyiden rakentaja

Dynaamisen SQL-kyselyn rakentaminen StringBuilderilla siten, että ehtolausekkeet lisätään tarpeen mukaan.

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

Pikatarkistus

Miksi merkkijonojen yhdistäminen +-operaattorilla on tehotonta silmukoissa?

Kertaus: StringBuilder tehokkaaseen yhdistämiseen

Tärkeimmät asiat:

  • StringBuilder on muuttuva — append, insert ja delete muuttavat sisäistä puskuria
  • Käyttäkää StringBuilderia silmukoissa välttääksenne O(n²)-aikavaativuuden merkkijonojen luonnissa
  • Kaikki muuttavat metodit palauttavat this-arvon, mikä mahdollistaa sujuvan metodiketjutuksen
  • Alustakaa StringBuilder odotetulla kapasiteetilla sisäisen koon muuttamisen vähentämiseksi
  • StringJoiner ja String.join ovat käteviä erottimella erotettuun tulosteeseen
  • StringBuffer on synkronoitu eli säieturvallinen, mutta hitaampi vaihtoehto
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”StringBuilder tehokkaaseen yhdistämiseen” ilmainen?

Kyllä – oppitunnin ”StringBuilder tehokkaaseen yhdistämiseen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”StringBuilder tehokkaaseen yhdistämiseen”?

Käytä StringBuilderia merkkijonojen tehokkaaseen rakentamiseen silmukoissa ja monimutkaisessa muotoilussa. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”StringBuilder tehokkaaseen yhdistämiseen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. String-tyypin muuttumattomuus ja String Pool
  2. StringBuilder tehokkaaseen yhdistämiseen
  3. Tekstilohkot ja String.format
  4. Säännölliset lausekkeet Pattern- ja Matcher-luokilla
← Takaisin: Java Academy