Programavimas

„StringBuffer“ ir „String“

„Java“ teikia „StringBuffer“ ir Stygos klasės ir Stygos klasė naudojama manipuliuoti simbolių eilutėmis, kurių negalima pakeisti. Paprasčiau tariant, tipo objektai Stygos yra tik skaitomi ir nekintami. „StringBuffer“ klasė naudojama simboliams, kuriuos galima keisti, žymėti.

Didelis šių dviejų klasių našumo skirtumas yra tas „StringBuffer“ yra greitesnis nei Stygos atliekant paprastus sujungimus. Į Stygos manipuliavimo kodas, simbolių eilutės yra įprastai sujungtos. Naudojant Stygos klasėje, sujungimai paprastai atliekami taip:

 String str = nauja styga („Stanford“); str + = "Prarasta !!"; 

Jei naudotumėtės „StringBuffer“ norint atlikti tą patį sujungimą, jums reikės tokio kodo:

 StringBuffer str = naujas StringBuffer („Stanfordas“); str.append („Pamesta !!“); 

Kūrėjai paprastai daro prielaidą, kad pirmasis aukščiau pateiktas pavyzdys yra efektyvesnis, nes mano, kad antrasis pavyzdys, kuriame naudojamas pridėti sujungimo metodas yra brangesnis nei pirmasis pavyzdys, kuriame naudojamas + operatorius susieti du Stygos objektai.

+ operatorius atrodo nekaltas, tačiau sugeneruotas kodas sukelia staigmenų. Naudojant a „StringBuffer“ sujungimui iš tikrųjų galima sukurti kodą, kuris yra žymiai greitesnis nei naudojant a Stygos. Norėdami sužinoti, kodėl taip yra, turime išnagrinėti sugeneruotą baito kodą iš savo dviejų pavyzdžių. Pavyzdžio bytecode naudojant Stygos atrodo taip:

0 naujas # 7 3 dup 4 ldc # 2 6 invokespecial # 12 9 astore_1 10 new # 8 13 dup 14 aload_1 15 invokestatic # 23 18 invokespecial # 13 21 ldc # 1 23 invokevirtual # 15 26 invokevirtual # 22 29 astore_1 

Baitų kodas 0–9 vietose vykdomas pirmoje kodo eilutėje, būtent:

 String str = nauja styga („Stanford“); 

Tada susiejimui vykdomas baitų kodas 10–29 vietose:

 str + = "Prarasta !!"; 

Čia viskas įdomu. Susiejimui sukurtas baitkodas sukuria „StringBuffer“ objektas, tada iškviečia jo pridėti metodas: laikinas „StringBuffer“ objektas yra sukurtas 10 vietoje, ir jo pridėti metodas vadinamas 23 vietoje. Kadangi Stygos klasė yra nekintama, a „StringBuffer“ turi būti naudojami sujungimui.

Atlikus sujungimą „StringBuffer“ objektas, jis turi būti paverstas atgal į a Stygos. Tai daroma iškvietus toString metodas vietoje 26. Šis metodas sukuria naują Stygos objektas iš laikino „StringBuffer“ objektas. Šio laikino kūrimas „StringBuffer“ objektas ir tolesnis jo pavertimas atgal į a Stygos objektas yra labai brangus.

Apibendrinant galima pasakyti, kad dvi pirmiau nurodytos kodo eilutės sukuria tris objektus:

  1. A Stygos objektas 0 vietoje
  2. A „StringBuffer“ objektas 10 vietoje
  3. A Stygos objektas 26 vietoje

Dabar pažvelkime į pavyzdžio, sukurto, baitų kodą „StringBuffer“:

0 naujų # 8 3 dup 4 ldc # 2 6 invokespecial # 13 9 astore_1 10 aload_1 11 ldc # 1 13 invokevirtual # 15 16 pop 

Baitų kodas 0–9 vietose vykdomas pirmoje kodo eilutėje:

 StringBuffer str = naujas StringBuffer („Stanfordas“); 

Tada baitekodas 10–16 vietoje vykdomas sujungiant:

 str.append („Pamesta !!“); 

Atkreipkite dėmesį, kad, kaip ir pirmame pavyzdyje, šis kodas naudoja pridėti metodas „StringBuffer“ objektas. Skirtingai nuo pirmojo pavyzdžio, laikino sukurti nereikia „StringBuffer“ ir tada paverskite jį a Stygos objektas. Šis kodas sukuria tik vieną objektą „StringBuffer“, 0 vietoje.

Apibendrinant, „StringBuffer“ sujungimas yra žymiai greitesnis nei Stygos sujungimas. Akivaizdu, „StringBuffer“s, jei įmanoma, turėtų būti naudojami atliekant tokio tipo operacijas. Jei funkcionalumas Stygos klasės pageidaujama, apsvarstykite galimybę naudoti a „StringBuffer“ sujungimui ir po to atliekant vieną konversiją į Stygos.

Reggie Hutcherson yra „Sun“ technologijų evangelistas. Jis visame pasaulyje evangelizuoja „Sun 2 Java“ platformos technologijas, daugiausia dėmesio skirdamas J2SE ir „HotSpot“ našumo varikliui.

Sužinokite daugiau apie šią temą

  • "„JavaWorld“ debiutuoja nauja savaitinė „Java“ skiltis „Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)

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

  • „Java atlikimo pagrindai“, Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)

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

  • "Našumo ar dizaino problema?" Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)

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

  • „Kompiliatoriaus optimizavimas“, Reggie Hutcherson („JavaWorld“, 2000 m. Kovo mėn.)

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

Šią istoriją „StringBuffer versus String“ iš pradžių išleido „JavaWorld“.

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