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:
- A
Stīga
objekts 0 vietā - A
StringBuffer
objekts 10. vietā - 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, StringBuffer
s, 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
.
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.