Java poskytuje StringBuffer
a String
triedy a String
trieda sa používa na manipuláciu s reťazcami znakov, ktoré sa nedajú zmeniť. Jednoducho povedané, objekty typu String
sú iba na čítanie a nemenné. The StringBuffer
trieda sa používa na vyjadrenie znakov, ktoré je možné upraviť.
Významný rozdiel vo výkone medzi týmito dvoma triedami je ten StringBuffer
je rýchlejší ako String
pri vykonávaní jednoduchých zreťazení. V String
manipulačný kód, reťazce znakov sú bežne zreťazené. Pomocou String
triedy sa zreťazenia zvyčajne vykonávajú nasledovne:
Reťazec str = nový Reťazec ("Stanford"); str + = "Stratený !!";
Ak by ste mali použiť StringBuffer
na vykonanie rovnakého zreťazenia potrebujete kód, ktorý vyzerá takto:
StringBuffer str = nový StringBuffer ("Stanford"); str.append ("Stratené !!");
Vývojári zvyčajne predpokladajú, že prvý príklad uvedený vyššie je efektívnejší, pretože si myslia, že druhý príklad, ktorý používa pridať
metóda zreťazenia je nákladnejšia ako prvý príklad, ktorý používa +
operátor zreťaziť dva String
predmety.
The +
operátor sa javí nevinný, ale vygenerovaný kód prináša určité prekvapenia. Pomocou a StringBuffer
pre zreťazenie môže v skutočnosti vyprodukovať kód, ktorý je podstatne rýchlejší ako pri použití a String
. Aby sme zistili, prečo je to tak, musíme preskúmať vygenerovaný bytecode z našich dvoch príkladov. Bajtový kód pre použitie príkladu String
vyzerá takto:
0 nových # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 nových # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokespecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1
Bajtkód na miestach 0 až 9 sa vykoná pre prvý riadok kódu, konkrétne:
Reťazec str = nový Reťazec ("Stanford");
Potom sa vykoná bajtový kód na mieste 10 až 29 pre zreťazenie:
str + = "Stratený !!";
Veci sa tu stanú zaujímavými. Bajtkód vygenerovaný pre zreťazenie vytvorí a StringBuffer
objekt, potom vyvolá jeho pridať
metóda: dočasná StringBuffer
objekt je vytvorený na mieste 10 a jeho pridať
metóda sa volá na mieste 23. Pretože String
trieda je nemenná, a StringBuffer
sa musí použiť na zreťazenie.
Po zreťazení sa vykoná na StringBuffer
objekt, musí sa konvertovať späť na a String
. Toto sa deje s volaním do natiahnuť
metóda na mieste 26. Táto metóda vytvorí nový String
predmet z dočasného StringBuffer
objekt. Vytvorenie tohto dočasného StringBuffer
objekt a jeho následná premena späť na a String
objekt sú veľmi drahé.
Stručne povedané, dva riadky kódu vyššie vedú k vytvoreniu troch objektov:
- A
String
objekt na mieste 0 - A
StringBuffer
objekt na mieste 10 - A
String
objekt na mieste 26
Teraz sa pozrime na bytecode vygenerovaný pre príklad pomocou StringBuffer
:
0 nových # 8 3 dup 4 ldc # 2 6 invokácií špeciálne # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtuálnych # 15 16 pop
Bajtkód na miestach 0 až 9 sa vykoná pre prvý riadok kódu:
StringBuffer str = nový StringBuffer ("Stanford");
Pre zreťazenie sa potom vykoná bajtový kód na mieste 10 až 16:
str.append ("Stratené !!");
Všimnite si, že ako je to v prvom príklade, tento kód vyvoláva znak pridať
metóda a StringBuffer
objekt. Na rozdiel od prvého príkladu však nie je potrebné vytvárať dočasné StringBuffer
a potom ho previesť na a String
objekt. Tento kód vytvára iba jeden objekt, StringBuffer
, na mieste 0.
Na záver, StringBuffer
zreťazenie je podstatne rýchlejšie ako String
zreťazenie. Je zrejmé, že StringBuffer
Pokiaľ je to možné, mali by sa pri tomto type operácie používať s. Ak je funkčnosť String
triedy je žiaduce, zvážte použitie a StringBuffer
na zreťazenie a potom vykonanie jednej premeny na String
.
Získajte viac informácií o tejto téme
- "JavaWorld debutuje nový týždenný stĺpec výkonnosti Java, „Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf.html
- „Základy výkonu v prostredí Java,“ Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html
- „Problém s výkonom alebo dizajnom?“ Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html
- „Optimalizácia kompilátora,“ Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html
Tento príbeh „StringBuffer verzus String“ bol pôvodne publikovaný spoločnosťou JavaWorld.