Programiranje

StringBuffer v primerjavi z nizom

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:

  1. A Vrvica predmet na lokaciji 0
  2. A StringBuffer predmet na lokaciji 10
  3. 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 StringBufferPri 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.

Reggie Hutcherson je evangelist tehnologije Sun. Po vsem svetu evangelizira Sun-ove tehnologije Java 2 Platform in se osredotoča na J2SE in HotSpot.

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.

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