Programmēšana

StringBuffer pret virkni

Java nodrošina StringBuffer un Stīga klases un Stīga klase tiek izmantota, lai manipulētu ar rakstzīmju virknēm, kuras nevar mainīt. Vienkārši teikts, tipa objekti Stīga ir tikai lasāmi un nemaināmi. The StringBuffer klase tiek izmantota, lai attēlotu rakstzīmes, kuras var mainīt.

Būtiskā veiktspējas atšķirība starp šīm divām klasēm ir tā StringBuffer ir ātrāks nekā Stīga veicot vienkāršus savienojumus. In Stīga manipulācijas kods, rakstzīmju virknes tiek regulāri savienotas. Izmantojot Stīga klasē savienojumus parasti veic šādi:

 String str = jauna virkne ("Stanford"); str + = "Pazudis !!"; 

Ja jūs izmantotu StringBuffer lai veiktu to pašu savienošanu, jums būs nepieciešams kods, kas izskatās šādi:

 StringBuffer str = jauns StringBuffer ("Stanford"); str.append ("Pazudis !!"); 

Izstrādātāji parasti pieņem, ka pirmais iepriekš minētais piemērs ir efektīvāks, jo viņi domā, ka otrais piemērs, kurā tiek izmantots pievienot savienošanas metode ir dārgāka nekā pirmais piemērs, kurā izmantots + operatoram savienot divus Stīga objektiem.

The + operators šķiet nevainīgs, taču ģenerētais kods rada dažus pārsteigumus. Izmantojot a StringBuffer savienošanai faktiski var izveidot kodu, kas ir ievērojami ātrāks nekā a Stīga. Lai uzzinātu, kāpēc tas tā ir, mums jāpārbauda ģenerētais baitkods no mūsu diviem piemēriem. Baitkods piemēram, izmantojot Stīga izskatās šādi:

0 jauns # 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 

Baitkods vietās no 0 līdz 9 tiek izpildīts pirmajai koda rindai, proti:

 String str = jauna virkne ("Stanford"); 

Pēc tam sasaistīšanai tiek izpildīts baitkods vietā no 10. līdz 29.:

 str + = "Pazudis !!"; 

Šeit lietas kļūst interesantas. Saķēdēšanai ģenerētais baitkods izveido a StringBuffer objektu, pēc tam izsauc to pievienot metode: pagaidu StringBuffer objekts ir izveidots 10. vietā, un tā pievienot metodi sauc par atrašanās vietu 23. Tā kā Stīga klase ir nemainīga, a StringBuffer jālieto savienošanai.

Pēc savienošanas veikšanas StringBuffer objekts, tas jāpārvērš atpakaļ par Stīga. Tas tiek darīts ar zvanu toString metode 26. vietā. Šī metode rada jaunu Stīga objekts no pagaidu StringBuffer objekts. Šī pagaidu radīšana StringBuffer objekts un tā turpmākā pārveidošana par a Stīga objekts ir ļoti dārgs.

Kopumā divas iepriekšminētās koda rindas rada trīs objektus:

  1. A Stīga objekts 0 vietā
  2. A StringBuffer objekts 10. vietā
  3. A Stīga objekts 26. vietā

Tagad apskatīsim baitu kodu, kas ģenerēts piemēram StringBuffer:

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

Baitkods vietās no 0 līdz 9 tiek izpildīts pirmajai koda rindai:

 StringBuffer str = jauns StringBuffer ("Stanford"); 

Baitkods vietā 10 līdz 16 tiek izpildīts savienošanai:

 str.append ("Pazudis !!"); 

Ievērojiet, ka, kā tas ir pirmajā piemērā, šis kods izsauc pievienot metode a StringBuffer objekts. Atšķirībā no pirmā piemēra, nav nepieciešams izveidot pagaidu StringBuffer un pēc tam pārveidojiet to par a Stīga objekts. Šis kods izveido tikai vienu objektu StringBuffer, 0 vietā.

Noslēgumā, StringBuffer savienošana notiek ievērojami ātrāk nekā Stīga savienošana. Protams, StringBuffers, ja iespējams, jāizmanto šāda veida operācijās. Ja funkcionalitāte Stīga klase ir vēlama, apsveriet iespēju izmantot a StringBuffer savienošanai un pēc tam veikt vienu konvertēšanu uz Stīga.

Redžijs Hačersons ir Saules tehnoloģiju evaņģēlists. Viņš visā pasaulē evaņģelizē Sun Java 2 platformas tehnoloģijas, koncentrējoties uz J2SE un HotSpot veiktspējas dzinēju.

Uzziniet vairāk par šo tēmu

  • "JavaWorld debitē jauna iknedēļas Java veiktspējas sleja "Redžijs Hačersons (JavaWorld, 2000. gada marts)

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

  • "Java veiktspējas pamati", Redžijs Hačersons (JavaWorld, 2000. gada marts)

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

  • "Veiktspējas vai dizaina problēma?" Redžija Hačersone (JavaWorld, 2000. gada marts)

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

  • "Sastādītāja optimizācijas", Redžijs Hačersons (JavaWorld, 2000. gada marts)

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

Šo stāstu “StringBuffer versus String” sākotnēji publicēja JavaWorld.

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