Programovanie

StringBuffer verzus String

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:

  1. A String objekt na mieste 0
  2. A StringBuffer objekt na mieste 10
  3. 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 StringBufferPokiaľ 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.

Reggie Hutcherson je evanjelistkou technológie Sun. Evanjelizuje technológie platformy Sun Java 2 po celom svete a sústreďuje sa na J2SE a výkonný motor HotSpot.

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.

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