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ů:
- A
Tětiva
objekt na místě 0 - A
StringBuffer
objekt na místě 10 - 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ě, StringBuffer
Pokud 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
.
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.