Programování

StringBuffer versus řetězec

Java poskytuje StringBuffer a Tětiva třídy a Tětiva třída se používá k manipulaci s řetězci znaků, které nelze změnit. Jednoduše řečeno, objekty typu Tětiva jsou jen pro čtení a neměnné. The StringBuffer třída se používá k reprezentaci znaků, které lze upravit.

Významný rozdíl ve výkonu mezi těmito dvěma třídami je v tom StringBuffer je rychlejší než Tětiva při provádění jednoduchých zřetězení. v Tětiva manipulační kód, řetězce znaků jsou rutinně zřetězeny. Za použití Tětiva třídy, zřetězení se obvykle provádí následujícím způsobem:

 String str = new String ("Stanford"); str + = "Ztracen !!"; 

Pokud byste měli použít StringBuffer k provedení stejného zřetězení budete potřebovat kód, který vypadá takto:

 StringBuffer str = nový StringBuffer ("Stanford"); str.append ("Ztraceno !!"); 

Vývojáři obvykle předpokládají, že první příklad výše je efektivnější, protože si myslí, že druhý příklad, který používá připojit metoda zřetězení je nákladnější než první příklad, který používá + operátor zřetězit dva Tětiva předměty.

The + operátor vypadá nevinně, ale vygenerovaný kód přináší určitá překvapení. Používat StringBuffer pro zřetězení může ve skutečnosti vytvořit kód, který je výrazně rychlejší než použití a Tětiva. Abychom zjistili, proč tomu tak je, musíme prozkoumat vygenerovaný bytecode z našich dvou příkladů. Bajtkód pro použití příkladu Tětiva vypadá 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 místech 0 až 9 se provede pro první řádek kódu, jmenovitě:

 String str = new String ("Stanford"); 

Potom se provede bajtový kód na místě 10 až 29 pro zřetězení:

 str + = "Ztracen !!"; 

Věci budou zajímavé zde. Bajtkód vygenerovaný pro zřetězení vytvoří a StringBuffer objekt, poté vyvolá jeho připojit metoda: dočasná StringBuffer objekt je vytvořen na místě 10 a jeho připojit metoda se volá na místě 23. Protože Tětiva třída je neměnná, a StringBuffer musí být použito pro zřetězení.

Po provedení zřetězení na StringBuffer objekt, musí být převeden zpět na a Tětiva. To se děje s voláním do toString metoda na místě 26. Tato metoda vytvoří novou Tětiva objekt z dočasného StringBuffer objekt. Vytvoření tohoto dočasného StringBuffer objekt a jeho následná konverze zpět na a Tětiva objekt jsou velmi drahé.

Stručně řečeno, dva řádky kódu výše vedou k vytvoření tří objektů:

  1. A Tětiva objekt na místě 0
  2. A StringBuffer objekt na místě 10
  3. A Tětiva objekt na místě 26

Nyní se podívejme na bytecode vygenerovaný pro použití příkladu StringBuffer:

0 nový # 8 3 dup 4 ldc # 2 6 vyvolává speciální # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop 

Bajtkód na místech 0 až 9 se provede pro první řádek kódu:

 StringBuffer str = nový StringBuffer ("Stanford"); 

Bajtkód na místě 10 až 16 se poté provede pro zřetězení:

 str.append ("Ztraceno !!"); 

Všimněte si, že stejně jako v prvním příkladu tento kód vyvolá připojit metoda a StringBuffer objekt. Na rozdíl od prvního příkladu však není nutné vytvářet dočasné StringBuffer a poté jej převést na Tětiva objekt. Tento kód vytvoří pouze jeden objekt, StringBuffer, na místě 0.

Závěrem, StringBuffer zřetězení je podstatně rychlejší než Tětiva zřetězení. Očividně, StringBufferPokud je to možné, měla by být v tomto typu operace použita s. Pokud je funkčnost Tětiva třída je žádoucí, zvažte použití a StringBuffer pro zřetězení a poté provedení jedné konverze na Tětiva.

Reggie Hutcherson je evangelistka technologie Sun. Evangelizuje technologie platformy Sun Java 2 po celém světě a soustředí se na J2SE a výkonový motor HotSpot.

Další informace o tomto tématu

  • "JavaWorld debutuje nový týdenní sloupec výkonu Java, „Reggie Hutcherson (JavaWorld, Březen 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf.html

  • „Základy výkonu Java,“ Reggie Hutcherson (JavaWorld, Březen 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html

  • „Problém s výkonem nebo designem?“ Reggie Hutcherson (JavaWorld, Březen 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html

  • „Optimalizace kompilátoru,“ Reggie Hutcherson (JavaWorld, Březen 2000)

    //www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html

Tento příběh „StringBuffer versus String“ původně publikoval JavaWorld.

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