StringBuilder vs StringBuffer na Javi

1. Pregled

U ovom ćemo kratkom članku pogledati sličnosti i razlike između StringBuilder i StringBuffer na Javi.

Jednostavno rečeno, StringBuilder je uveden u Javi 1.5 kao zamjena za StringBuffer.

2. Sličnosti

Oba StringBuilder i StringBuffer stvoriti predmete koji sadrže promjenjivi niz znakova. Pogledajmo kako ovo funkcionira i kako se uspoređuje s nepromjenjivim Niz razred:

Niz nepromjenjiv = "abc"; nepromjenjiv = nepromjenjiv + "def";

Iako se može činiti da isti objekt mijenjamo dodavanjem "Def", stvaramo novi jer Niz instance se ne mogu mijenjati.

Kada se koristi bilo koji StringBuffer ili StringBuilder, možemo koristiti dodati() metoda:

StringBuffer sb = novi StringBuffer ("abc"); sb.append ("def");

U ovom slučaju nije stvoren novi objekt. Nazvali smo dodati() metoda na sb instanci i izmijenio njezin sadržaj. StringBuffer i StringBuilder su promjenjivi predmeti.

3. Razlike

StringBuffer je sinkroniziran i stoga siguran za nit.StringBuilder je kompatibilan sa StringBuffer API, ali bez jamstva sinkronizacije.

Budući da nije implementacija sigurna u nitima, brža je i preporučuje se da je koristite na mjestima na kojima nema potrebe za sigurnošću niti.

3.1. Izvođenje

U malim ponavljanjima razlika u izvedbi je beznačajna. Napravimo brzi mikro-benchmark s JMH:

@State (Scope.Benchmark) javna statička klasa MyState {int iterations = 1000; Niz početni = "abc"; Sufiks niza = "def"; } @Benchmark javni StringBuffer benchmarkStringBuffer (stanje MyState) {StringBuffer stringBuffer = novi StringBuffer (state.initial); for (int i = 0; i <state.iterations; i ++) {stringBuffer.append (state.suffix); } return stringBuffer; } @Benchmark javni StringBuilder benchmarkStringBuilder (stanje MyState) {StringBuilder stringBuilder = novi StringBuilder (state.initial); for (int i = 0; i <state.iterations; i ++) {stringBuilder.append (state.suffix); } return stringBuilder; }

Koristili smo zadano Propusnost način rada - tj. operacije u jedinici vremena (bolji je viši rezultat), koji daje:

Benchmark Mode Cnt Score Greške Jedinice StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 86169.834 ± 972.477 ops / s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 91076.952 ± 2818.028 ops / s

Ako broj iteracija povećamo s 1k na 1m, dobivamo:

Benchmark Mode Cnt Rezultat Jedinice pogrešaka StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 77,178 ± 0,898 ops / s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 85,769 ± 1,966 ops / s

No, imajmo na umu da je ovo mikro-mjerilo, koje može ili ne mora imati stvarni utjecaj na stvarnu izvedbu aplikacije u stvarnom svijetu.

4. Zaključci

Jednostavno rečeno, StringBuffer je implementacija sigurna u niti i stoga je sporija od StringBuilder.

U programima s jednim navojem možemo uzeti StringBuilder. Još, dobitak u izvedbi od StringBuilder nad StringBuffer možda premala da bi opravdala njegovu zamjenu posvuda. Uvijek je dobra ideja profilirati aplikaciju i razumjeti njezine karakteristike izvedbe prije izvođenja bilo kakvog posla kako biste zamijenili jednu implementaciju drugom.

Napokon, kao i uvijek, kod korišten tijekom rasprave možete pronaći na GitHubu.