Java Academy · Lektion

StringBuilder kontra StringBuffer

Afvejninger ved trådsikkerhed

Lektion 4 af 413 trin

StringBuilder kontra StringBuffer er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

To foranderlige klasser

Java har to foranderlige strengklasser: StringBuilder og StringBuffer. Deres API'er er næsten identiske, men de adskiller sig på én afgørende måde: trådsikkerhed.

Samme API

Begge klasser tilbyder append, insert, delete, reverse og resten. Kode, der bruger den ene, kan normalt skifte til den anden ved kun at ændre 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 synkroniseret

Metoderne i StringBuffer er synkroniserede, hvilket betyder, at flere tråde sikkert kan ændre den samme instans. Denne sikkerhed koster en smule ydeevne.

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

StringBuilder er ikke synkroniseret

StringBuilder undlader synkronisering, hvilket gør den hurtigere. Til gengæld er det ikke sikkert at dele én instans mellem tråde uden koordinering udefra.

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

Hvornår skal du bruge StringBuilder?

Brug StringBuilder i det almindelige tilfælde: når du opbygger strenge inde i én enkelt metode eller tråd. Det er standardvalget i næsten al daglig 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);
    }
}

Hvornår skal du bruge StringBuffer?

Vælg kun StringBuffer, når den samme StringBuilder-instans reelt deles og ændres af flere tråde. Det er sjældent 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, der kun deklareres og bruges i én metode, er aldrig synlig for andre tråde, så StringBuilder er altid korrekt dér. Manglen på synkronisering kan ikke skabe 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());
    }
}

Ydelsesforskel

Synkroniseringsomkostningen i StringBuffer gør den langsommere ved brug med én tråd. I stramme løkker yder StringBuilder bedre.

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 bemærkning

StringBuffer kom først, i Javas tidlige år. StringBuilder blev tilføjet i Java 5 som det ikke-synkroniserede og hurtigere alternativ til det almindelige tilfælde med én tråd.

Vælg korrekt

Brug som udgangspunkt StringBuilder. Skift kun til StringBuffer, når du kan bevise, at én bestemt instans deles mellem tråde. Ellers betaler du for en sikkerhed, du ikke har brug for.

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 klasser producerer en uforanderlig String via toString(). Valget mellem dem påvirker kun opbygningen, ikke det endelige resultat.

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

Hurtig kontrol

Hvad er den vigtigste forskel mellem StringBuilder og StringBuffer?

Opsummering

Du har lært om afvejningerne:

  • Begge har næsten identiske API'er
  • StringBuffer er synkroniseret (trådsikker, men langsommere)
  • StringBuilder er ikke synkroniseret (hurtigere)
  • Brug som udgangspunkt StringBuilder til opbygning med én tråd
  • Brug kun StringBuffer til instanser, der faktisk deles
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “StringBuilder kontra StringBuffer” gratis?

Ja — hele teksten til “StringBuilder kontra StringBuffer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “StringBuilder kontra StringBuffer”?

Afvejninger ved trådsikkerhed Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “StringBuilder kontra StringBuffer”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor strings er immutable
  2. Byg strings med StringBuilder
  3. StringBuilder-metoder
  4. StringBuilder kontra StringBuffer
← Tilbage til Java Academy