Java Academy · leksjon

StringBuilder kontra StringBuffer

Avveininger knyttet til trådsikkerhet

Leksjon 4 av 413 trinn

StringBuilder kontra StringBuffer er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

To foranderlige klasser

Java har to foranderlige strengklasser: StringBuilder og StringBuffer. API-ene deres er nesten identiske, men de skiller seg på ett avgjørende punkt: trådsikkerhet.

Samme API

Begge klassene tilbyr append, insert, delete, reverse og resten. Kode som bruker den ene, kan vanligvis bytte til den andre ved å bare endre typenavnet.

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

StringBuffer er synkronisert

Metodene i StringBuffer er synkroniserte, noe som betyr at flere tråder trygt kan endre samme instans. Denne sikkerheten har en liten ytelseskostnad.

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

StringBuilder er ikke synkronisert

StringBuilder hopper over synkronisering, noe som gjør den raskere. Ulempen er at det ikke er trygt å dele én instans mellom tråder uten koordinering utenfra.

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

Når du bør bruke StringBuilder

Bruk StringBuilder i det vanlige tilfellet: når du bygger strenger inne i én enkelt metode eller tråd. Dette er standardvalget i nesten all vanlig kode.

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

Når du bør bruke StringBuffer

Velg StringBuffer bare når den samme builder-instansen faktisk deles og endres av flere tråder. Dette er sjeldent i praksis.

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

Lokale variabler deles ikke

En builder som bare deklareres og brukes inne i én metode, er aldri synlig for andre tråder, så StringBuilder er alltid riktig der. Manglende synkronisering kan ikke forårsake problemer.

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

Ytelsesforskjell

Synkroniseringskostnaden i StringBuffer gjør den tregere ved entrådet bruk. For tette løkker gir StringBuilder bedre ytelse.

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

Historisk merknad

StringBuffer kom først, i Javas tidlige historie. StringBuilder ble lagt til i Java 5 som det usynkroniserte og raskere alternativet for det vanlige entrådede tilfellet.

Velg riktig

La StringBuilder være standardvalget. Bytt bare til StringBuffer når De kan bevise at én enkelt instans deles mellom tråder. Ellers betaler De for sikkerhet De ikke trenger.

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

Begge konverterer til String

Begge klassene produserer en uforanderlig String gjennom toString(). Valget mellom dem påvirker bare oppbyggingen, ikke sluttresultatet.

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

Kort sjekk

Hva er hovedforskjellen mellom StringBuilder og StringBuffer?

Oppsummering

De har lært om avveiningene:

  • Begge har nesten identiske API-er
  • StringBuffer er synkronisert (trådsikker, tregere)
  • StringBuilder er usynkronisert (raskere)
  • La StringBuilder være standardvalget ved entrådet oppbygging
  • Bruk StringBuffer bare for instanser som faktisk deles
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «StringBuilder kontra StringBuffer» gratis?

Ja – hele teksten i «StringBuilder kontra StringBuffer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «StringBuilder kontra StringBuffer»?

Avveininger knyttet til trådsikkerhet Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «StringBuilder kontra StringBuffer»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Hvorfor strenger er uforanderlige
  2. Bygge strenger med StringBuilder
  3. StringBuilder-metoder
  4. StringBuilder kontra StringBuffer
← Tilbake til Java Academy