StringBuilder kontra StringBuffer
Afvejninger ved trådsikkerhed
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
StringBufferer synkroniseret (trådsikker, men langsommere)StringBuilderer ikke synkroniseret (hurtigere)- Brug som udgangspunkt
StringBuildertil opbygning med én tråd - Brug kun
StringBuffertil instanser, der faktisk deles
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
- Hvorfor strings er immutable
- Byg strings med StringBuilder
- StringBuilder-metoder
- StringBuilder kontra StringBuffer