Sa Java mayroon bang pagkakaiba sa pagganap sa pagitan ng paggamit ng "+" operator at StringBuilder?


sagot 1:

Sa Java mayroon bang pagkakaiba sa pagganap sa pagitan ng paggamit ng "+" operator at StringBuilder?

Sa isang solong linya tulad ng mga ito:

String string1 = "isa" + "dalawa";
String string2 = bagong StringBuilder ("isa"). Append ("dalawa"). ToString ();

Hindi dapat magkaroon ng pagkakaiba sa pagganap. Sa katunayan, sa mga modernong ekosistema ng Java, ang una ay na-optimize sa pangalawa sa pag-compile ng oras. Upang makita ito sa aksyon, subukang mag-hakbang sa una gamit ang iyong paboritong debugger.

Gayunpaman, kung ang iyong mga pinagsama-samang mga string sa magkahiwalay na linya o, sabihin mo, para sa isang loop:

String string1 = "";
StringBuilder sb = bagong StringBuilder ();

para sa (Integer i = 0; i <5; i ++) {
  string1 = string1 + i.toString ();
  sb.append (i.toString ());
}

String string2 = sb.toString ();

Pagkatapos ang paggamit ng isang StringBuilder ay mas "mahusay" at kung minsan ang prefered na paraan upang makabuo ng isang mas kumplikadong string. Sa pagkakaalam ko, sa kasalukuyan ay walang Java compiler na mai-optimize ang paulit-ulit sa StringBuilder.


sagot 2:

Maikling sagot: maaaring, ngunit sa karamihan ng oras hindi ito nagkakahalaga ng pag-aalala. Pabor na malinaw ang code sa napaaga na pag-optimize.

Ang mga modernong JVM ay maaaring ma-optimize ang String concatenation na may "+" at i-on ito sa isang StringBuilder, at dahil makikita nila kung gaano katagal ang magreresultang String, maaari silang maglaan ng tamang sukat sa StringBuilder sa simula. Kung lumikha ka ng isang StringBuilder ng iyong sarili gamit ang default na laki ng array, maaaring kailanganing palakihin ang char array, na nagsasangkot ng isang kopya ng array, sa gayon ay maaaring maging mas mabagal.

Dahil ang Java 9, ang pagtatapos ng tali ay mas na-optimize, na may isang diskarte na nagpasya sa runtime.

Kung paulit-ulit kang nagdaragdag sa isang String sa isang loop, baka hindi ka maaaring magkamali gamit ang isang StringBuilder, ngunit gugulin ang tamang laki nang maaga kung alam ito. Sa labas ng mga loop, dumikit kasama ang "+" kapag ito ay mas madaling mabasa; at tiwala na ang JVM ay, o sa lalong madaling panahon ay magiging, mas mahusay sa pag-optimize kaysa sa iyo.