StringBuilder vs StringBuffer v Jave

1. Prehľad

V tomto krátkom článku sa pozrieme na podobnosti a rozdiely medzi nimi StringBuilder a StringBuffer v Jave.

Jednoducho povedané, StringBuilder bol predstavený v prostredí Java 1.5 ako náhrada za StringBuffer.

2. Podobnosti

Oboje StringBuilder a StringBuffer vytvárať objekty, ktoré obsahujú premenlivú postupnosť znakov. Pozrime sa, ako to funguje a ako je to v porovnaní s nemenným String trieda:

Reťazec nemenný = "abc"; nemenný = nemenný + "def";

Aj keď to môže vyzerať, upravujeme rovnaký objekt pripojením „Def“, vytvárame nový, pretože String inštancie nie je možné upraviť.

Pri použití oboch StringBuffer alebo StringBuilder, môžeme použiť pridať () metóda:

StringBuffer sb = nový StringBuffer ("abc"); sb.append ("def");

V tomto prípade nebol vytvorený žiadny nový objekt. Volali sme pridať () metóda na sb inštanciu a upravil jej obsah. StringBuffer a StringBuilder sú premenlivé objekty.

3. Rozdiely

StringBuffer je synchronizovaný a teda bezpečný pre vlákna.StringBuilder je kompatibilný s StringBuffer API, ale bez záruky synchronizácie.

Pretože nejde o implementáciu bezpečnú pre vlákna, je rýchlejšia a odporúča sa používať ju na miestach, kde bezpečnosť vlákien nie je potrebná.

3.1. Výkon

V malých iteráciách je rozdiel vo výkonnosti nevýznamný. Urobme rýchly mikro-benchmark s JMH:

@State (Scope.Benchmark) verejná statická trieda MyState {int iterácie = 1000; Reťazec initial = "abc"; Prípona reťazca = "def"; } @Benchmark public StringBuffer benchmarkStringBuffer (stav MyState) {StringBuffer stringBuffer = nový StringBuffer (state.initial); pre (int i = 0; i <state.iterations; i ++) {stringBuffer.append (state.suffix); } return stringBuffer; } @Benchmark public StringBuilder benchmarkStringBuilder (stav MyState) {StringBuilder stringBuilder = nový StringBuilder (state.initial); pre (int i = 0; i <state.iterations; i ++) {stringBuilder.append (state.suffix); } return stringBuilder; }

Použili sme predvolené nastavenie Priepustnosť režim - teda operácie za jednotku času (lepšie skóre je lepšie), ktorý dáva:

Benchmark Mode Cnt Score Error Units StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 86169,834 ± 972,477 ops / s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 91076,952 ± 2818,028 ops / s

Ak zvýšime počet iterácií z 1k na 1m, dostaneme:

Benchmark Mode Cnt Score Error Units StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 77,178 ± 0,898 ops / s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 85,769 ± 1,966 ops / s

Nezabúdajme však, že ide o mikro-test, ktorý môže alebo nemusí mať skutočný dopad na skutočný výkon aplikácie v reálnom svete.

4. Závery

Jednoducho povedané StringBuffer je implementácia bezpečná pre vlákna, a preto pomalšia ako implementácia StringBuilder.

V jednovláknových programoch môžeme brať z StringBuilder. Ešte, zvýšenie výkonu StringBuilder cez StringBuffer môže byť príliš malá na to, aby ju bolo možné všade nahradiť. Pred vykonaním akejkoľvek práce na nahradení jednej implementácie druhou implementáciou je vždy dobré aplikáciu profilovať a pochopiť jej výkonové charakteristiky za behu.

Nakoniec, ako vždy, kód použitý počas diskusie nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found