Je li u Javi razlika u performansama između korištenja "+" operatera i StringBuilder?


Odgovor 1:

Je li u Javi razlika u performansama između korištenja "+" operatera i StringBuilder?

U jednom retku poput ovog:

String string1 = "jedan" + "dva";
String string2 = novi StringBuilder ("jedan"). Dodaj ("dva"). ToString ();

U izvedbi ne bi trebalo biti razlike. Zapravo je u modernim Java ekosustavima prvi optimiziran za drugi u vrijeme sastavljanja. Da biste to vidjeli na djelu, pokušajte koraknuti na prvu koristeći svoj omiljeni program za uklanjanje pogrešaka.

Međutim, ako vaši nizovi za spajanje u zasebnim linijama ili, recimo, u petlji za:

String string1 = “”;
StringBuilder sb = novi StringBuilder ();

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

String string2 = sb.toString ();

Zatim je upotreba StringBuilder „učinkovitija“ i ponekad je preferirani način za izgradnju složenijih niza. Koliko znam, trenutno nijedan Java prevoditelj neće optimizirati ponavljanje + u StringBuilder.


Odgovor 2:

Kratki odgovor: može postojati, ali većinu vremena se ne vrijedi brinuti. Preferirajte jasan kod zbog preuranjene optimizacije.

Moderni JVM-ovi mogu optimizirati spajanje stringova s ​​"+" i pretvoriti ga u StringBuilder, a budući da mogu vidjeti koliko će dugo nastati String, oni mogu na početku dodijeliti StringBuilderu odgovarajuću veličinu. Ako sami kreirate StringBuilder koristeći zadanu veličinu matrice, matriks char možda će se morati kasnije povećati, što uključuje kopiju matrice, pa bi zapravo mogao biti sporiji.

Budući da je Java 9, pridruživanje stringova mnogo je optimiziranije, sa strategijom koja se odlučuje u vrijeme izvođenja.

Ako više puta dodajete string u petlji, vjerojatno ne možete pogriješiti koristeći StringBuilder, ali dodijelite odgovarajuću veličinu unaprijed ako je poznata. Izvan petlje zalijepite "+" kad god bi bilo čitljivije; i vjerujte da će JVM biti ili će uskoro biti bolji u optimizaciji od vas.