Ar „Java“ yra skirtumų tarp „+“ operatoriaus ir „StringBuilder“ naudojimo?


Atsakymas 1:

Ar „Java“ yra skirtumų tarp „+“ operatoriaus ir „StringBuilder“ naudojimo?

Vienoje eilutėje, pavyzdžiui:

Styginių eilutė1 = „vienas“ + „du“;
Styginių eilutė2 = nauja „StringBuilder“ („viena“). Prideda („dvi“) „toString“ ();

Našumas neturėtų skirtis. Tiesą sakant, šiuolaikinėse „Java“ ekosistemose pirmoji yra optimizuota antrajai kompiliavimo metu. Norėdami pamatyti tai veikiantį, pabandykite žengti pirmąjį naudodami mėgstamą derintuvą.

Tačiau jei jūsų sujungimo stygos yra atskirose eilutėse arba, tarkime, „for“ kilpoje:

Styginių eilutė1 = “”;
„StringBuilder sb“ = nauja „StringBuilder“ ();

už (sveikasis skaičius = 0; i <5; i ++) {
  string1 = string1 + i.toString ();
  sb.append (i.toString ());
}

Styginių eilutė2 = sb.toString ();

Tada „StringBuilder“ naudojimas yra „efektyvesnis“ ir kartais yra tinkamiausias būdas sukurti sudėtingesnę eilutę. Kiek žinau, šiuo metu nė vienas „Java“ kompiliatorius optimizuos „+“ pasikartojimą „StringBuilder“.


Atsakymas 2:

Trumpas atsakymas: gali būti, bet dažniausiai jaudintis neverta. Geriau išvalykite kodą nei priešlaikinį optimizavimą.

Šiuolaikiniai JVM gali optimizuoti stygų sujungimą su „+“ ir paversti juos „StringBuilder“, ir kadangi jie gali pamatyti, kiek laiko truks gauta eilutė, jie gali „StringBuilder“ pradžioje skirti reikiamą dydį. Jei patys susikūrysite „StringBuilder“ naudodamiesi numatytuoju masyvo dydžiu, vėliau gali reikėti padidinti masyvo masyvą, kuris apima masyvo kopiją, taigi iš tikrųjų jis gali būti lėtesnis.

Nuo „Java 9“ styginių sujungimas yra daug labiau optimizuotas, o strategija pasirinkta vykdymo metu.

Jei pakartotinai pridedate stygos kilpoje, greičiausiai negalėsite suklysti naudodamiesi „StringBuilder“, tačiau iš anksto paskirstykite tinkamą dydį, jei jis žinomas. Už kilpų ribų pažymėkite „+“, kai tai bus lengviau skaitoma; ir patikėkite, kad JVM geriau ar greičiau taps geriau nei jūs.