Java ponuja StringBuffer
in Vrvica
razredi in Vrvica
class se uporablja za manipulacijo nizov znakov, ki jih ni mogoče spremeniti. Preprosto povedano, predmeti tipa Vrvica
so samo za branje in nespremenljive. The StringBuffer
class se uporablja za predstavitev znakov, ki jih je mogoče spremeniti.
Bistvena razlika v zmogljivosti med tema dvema razredoma je v tem StringBuffer
je hitrejši od Vrvica
pri izvajanju enostavnih povezav. V Vrvica
manipulacijske kode se nizi znakov rutinsko povežejo. Uporabljati Vrvica
razreda se združevanja običajno izvajajo na naslednji način:
String str = new String ("Stanford"); str + = "Izgubljeno !!";
Če bi uporabljali StringBuffer
če želite izvesti isto združitev, potrebujete kodo, ki je videti takole:
StringBuffer str = novo StringBuffer ("Stanford"); str.append ("Izgubljeno !!");
Razvijalci običajno domnevajo, da je prvi zgornji primer učinkovitejši, ker menijo, da drugi primer, ki uporablja priloži
metoda za združevanje je dražja od prvega primera, ki uporablja +
združiti dva Vrvica
predmetov.
The +
operater je videti nedolžen, vendar ustvarjena koda povzroči nekaj presenečenj. Uporaba a StringBuffer
za združevanje lahko dejansko ustvari kodo, ki je bistveno hitrejša kot uporaba a Vrvica
. Da bi ugotovili, zakaj je temu tako, moramo iz naših dveh primerov preučiti ustvarjeno bajtno kodo. Bytecode za primer uporabe Vrvica
izgleda takole:
0 novo # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 novo # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokespecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1
Bitna koda na lokacijah od 0 do 9 se izvede za prvo vrstico kode, in sicer:
String str = new String ("Stanford");
Nato se za povezovanje izvede bajtoda na lokaciji od 10 do 29:
str + = "Izgubljeno !!";
Tu postanejo stvari zanimive. Bitna koda, ustvarjena za povezovanje, ustvari StringBuffer
predmet, nato pa prikliče svoj priloži
metoda: začasna StringBuffer
objekt je ustvarjen na lokaciji 10 in njegov priloži
metoda se pokliče na lokaciji 23. Ker je Vrvica
razred je nespremenljiv, a StringBuffer
je treba uporabiti za združevanje.
Po izvedbi združitve na StringBuffer
predmet, ga je treba pretvoriti nazaj v Vrvica
. To se naredi s klicem na toString
metoda na lokaciji 26. Ta metoda ustvari novo Vrvica
predmet iz začasnega StringBuffer
predmet. Ustvarjanje tega začasnega StringBuffer
predmet in njegova nadaljnja pretvorba nazaj v Vrvica
predmet so zelo dragi.
Če povzamemo, dve vrstici zgornje kode ustvarita tri predmete:
- A
Vrvica
predmet na lokaciji 0 - A
StringBuffer
predmet na lokaciji 10 - A
Vrvica
objekt na lokaciji 26
Zdaj pa poglejmo bajtno kodo, ustvarjeno za primer z uporabo StringBuffer
:
0 novo # 8 3 dup 4 ldc # 2 6 invokespecial # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop
Bitna koda na mestih od 0 do 9 se izvede za prvo vrstico kode:
StringBuffer str = novo StringBuffer ("Stanford");
Nato se za povezovanje izvede bajtoda na lokaciji 10 do 16:
str.append ("Izgubljeno !!");
Upoštevajte, da se ta koda, kot v prvem primeru, sklicuje na priloži
metoda a StringBuffer
predmet. Za razliko od prvega primera pa ni treba ustvariti začasnega StringBuffer
in ga nato pretvorite v Vrvica
predmet. Ta koda ustvari samo en objekt, StringBuffer
, na lokaciji 0.
V zaključku, StringBuffer
združevanje je bistveno hitrejše od Vrvica
združitev. Očitno je StringBuffer
Pri tej vrsti operacije je treba uporabljati, kadar je to mogoče. Če funkcionalnost Vrvica
razredu, razmislite o uporabi a StringBuffer
za združitev in nato izvedbo ene pretvorbe v Vrvica
.
Preberite več o tej temi
- "JavaWorld prvi tedenski stolpec o uspešnosti Java, "Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf.html
- "Osnove delovanja Java," Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_2.html
- "Težava z zmogljivostjo ali težava z oblikovanjem?" Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_3.html
- "Optimizacije prevajalnika," Reggie Hutcherson (JavaWorld, Marec 2000)
//www.javaworld.com/jw-03-2000/jw-03-javaperf_4.html
To zgodbo "StringBuffer versus String" je prvotno objavil JavaWorld.