Vai Java ir veiktspējas atšķirība starp operatora "+" un StringBuilder izmantošanu?


Atbilde 1:

Vai Java ir veiktspējas atšķirība starp operatora "+" un StringBuilder izmantošanu?

Vienā rindā, piemēram:

Stīgu virkne1 = “viens” + “divi”;
Stīgu virkne2 = jauns StringBuilder (“viens”). Pievieno (“divi”) toString ();

Darbībā nevajadzētu būt atšķirībai. Faktiski mūsdienu Java ekosistēmās pirmais ir optimizēts otrajam sastādīšanas laikā. Lai redzētu to darbībā, mēģiniet sākt pirmo, izmantojot savu iecienītāko atkļūdotāju.

Tomēr, ja jūsu konkaējošās virknes atrodas atsevišķās līnijās vai, teiksim, for for cilpā:

Stīgu virkne1 = “”;
StringBuilder sb = jauns StringBuilder ();

priekš (vesels skaitlis i = 0; i <5; i ++) {
  string1 = string1 + i.toString ();
  sb.append (i.toString ());
}

Stīgu virkne2 = sb.toString ();

Tad StringBuilder izmantošana ir “efektīvāka”, un dažreiz tas ir vēlamais veids, kā izveidot sarežģītāku virkni. Cik es zinu, patlaban neviens Java kompilators optimizēs + atkārtošanu StringBuilder.


Atbilde 2:

Īsa atbilde: var būt, bet par to nav vērts uztraukties. Dod priekšroku skaidram kodam nekā priekšlaicīgai optimizācijai.

Mūsdienu JVM var optimizēt virknes apvienošanu ar "+" un pārvērst to par StringBuilder, un, tā kā viņi var redzēt, cik ilgs būs iegūtais stīgs, viņi sākumā var iedalīt pareizo izmēru StringBuilder. Ja pats izveidojat StringBuilder, izmantojot noklusējuma masīva lielumu, iespējams, ka char masīvu vēlāk vajadzēs palielināt, kas ietver masīva kopiju, tāpēc faktiski tas varētu būt lēnāks.

Kopš Java 9, virkņu apvienošana ir daudz optimizēta, par stratēģiju izlemjot izpildlaikā.

Ja atkārtoti pievienojat virkni cilpai, tad, iespējams, nevarat noiet greizi, izmantojot StringBuilder, bet iepriekš piešķiriet pareizo izmēru, ja tas ir zināms. Ārpus cilpām piestipriniet ar "+", kad tas ir lasāmāks; un paļaujieties, ka JVM ir optimāls vai drīz būs labāks nekā jūs.