StringBuilder vs StringBuffer Java-ban

1. Áttekintés

Ebben a rövid cikkben a hasonlóságokat és különbségeket fogjuk megvizsgálni StringBuilder és StringBuffer Java-ban.

Egyszerűen fogalmazva, StringBuilder a Java 1.5-be került bevezetésre StringBuffer.

2. Hasonlóságok

Mindkét StringBuilder és StringBuffer olyan objektumokat hozhat létre, amelyek mutábilis karaktersorozatot tartalmaznak. Lássuk, hogyan működik ez, és hogyan viszonyul egy megváltoztathatatlanhoz Húr osztály:

String változhatatlan = "abc"; változhatatlan = változhatatlan + "def";

Annak ellenére, hogy úgy néz ki, hogy ugyanazt az objektumot csatolva módosítjuk „Def”, újat hozunk létre, mert Húr a példányokat nem lehet módosítani.

Bármelyik használatakor StringBuffer vagy StringBuilder, használhatjuk a mellékel() módszer:

StringBuffer sb = új StringBuffer ("abc"); sb.append ("def");

Ebben az esetben nem hoztak létre új objektumot. Felhívtuk a mellékel() módszer be sb példányát, és módosította annak tartalmát. StringBuffer és StringBuilder változékony tárgyak.

3. Különbségek

StringBuffer szinkronizált és ezért szálbiztos.StringBuilder kompatibilis a következővel: StringBuffer API, de a szinkronizálás garanciája nélkül.

Mivel nem szálbiztos megvalósítás, gyorsabb, ezért ajánlott olyan helyeken használni, ahol nincs szükség szálbiztonságra.

3.1. Teljesítmény

Kis ismétléseknél a teljesítménykülönbség jelentéktelen. Tegyünk egy gyors mikro-benchmarkot a JMH-val:

@State (Scope.Benchmark) nyilvános statikus osztály MyState {int iterációk = 1000; Karakterlánc kezdő = "abc"; Karakterlánc utótag = "def"; } @Benchmark public StringBuffer benchmarkStringBuffer (MyState állapot) {StringBuffer stringBuffer = új StringBuffer (state.initial); for (int i = 0; i <állapot.iterációk; i ++) {stringBuffer.append (state.suffix); } return stringBuffer; } @Benchmark public StringBuilder benchmarkStringBuilder (MyState állapot) {StringBuilder stringBuilder = new StringBuilder (state.initial); for (int i = 0; i <állapot.iterációk; i ++) {stringBuilder.append (állapot.szótag); } return stringBuilder; }

Az alapértelmezettet használtuk Átbocsátás mód - azaz műveletek időegységenként (a magasabb pontszám jobb), ami:

Benchmark Mode Cnt Score Hibaegységek StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 86169.834 ± 972.477 ops / s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 91076.952 ± 2818.028 ops / s

Ha az ismétlések számát 1 k-ról 1 m-re növeljük, akkor a következőket kapjuk:

Benchmark Mode Cnt Score Hibaegységek StringBufferStringBuilder.benchmarkStringBuffer thrpt 200 77.178 ± 0.898 ops / s StringBufferStringBuilder.benchmarkStringBuilder thrpt 200 85.769 ± 1.966 ops / s

Ne felejtsük el azonban, hogy ez egy mikro-benchmark, amelynek lehet vagy nincs valódi hatása az alkalmazás tényleges, valós teljesítményére.

4. Konklúziók

Egyszerűen fogalmazva: StringBuffer egy szálbiztos megvalósítás, ezért lassabb, mint a StringBuilder.

Egyszálú programokban felvehetjük a StringBuilder. Még, teljesítményének nyeresége StringBuilder felett StringBuffer túl kicsi lehet annak igazolásához, hogy mindenhol kicseréljük. Mindig jó ötlet az alkalmazást áttekinteni és megérteni a futásidejű teljesítményjellemzőket, mielőtt bármilyen munkát végezne az egyik megvalósítás cseréjével egy másikra.

Végül, mint mindig, a vita során használt kód megtalálható a GitHubon.