I Java er der en ydelsesforskel mellem at bruge "+" operatoren og StringBuilder?


Svar 1:

I Java er der en ydelsesforskel mellem at bruge "+" operatoren og StringBuilder?

På en enkelt linje som disse:

String string1 = "en" + "to";
String string2 = new StringBuilder (“en”). Tilføj (“to”). ToString ();

Der bør ikke være nogen forskel i ydelse. Faktisk i moderne Java-økosystemer optimeres det første til det andet på kompileringstidspunktet. Hvis du vil se dette i handling, kan du prøve at gå ind i det første ved hjælp af din foretrukne debugger.

Men hvis dine sammenkædede strenge på separate linjer eller f.eks. I en for-loop:

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

for (Heltal i = 0; i <5; i ++) {
  streng1 = streng1 + i.toString ();
  sb.append (i.toString ());
}

Strengstreng2 = sb.toString ();

Derefter er brug af en StringBuilder mere "effektiv" og er undertiden den foretrukne måde at opbygge en mere kompleks streng. Så vidt jeg ved, optimerer i øjeblikket ingen Java-kompilator gentagelse af + 's til StringBuilder.


Svar 2:

Kort svar: der kan være, men for det meste er det ikke værd at bekymre sig om. Foretrukne klar kode frem for for tidlig optimering.

Moderne JVM'er kan optimere strengkonsatenation med "+" og omdanne den til en StringBuilder, og da de kan se, hvor lang tid den resulterende streng kommer til at være, kan de allokere den korrekte størrelse til StringBuilder i starten. Hvis du selv opretter en StringBuilder ved hjælp af standard arraystørrelse, skal karray-arrayen muligvis blive udvidet senere, hvilket involverer en array-kopi, så den kan faktisk være langsommere.

Siden Java 9 er String-sammenkædning meget mere optimeret med en strategi, der er besluttet på runtime.

Hvis du gentagne gange tilføjer til en streng i en løkke, kan du sandsynligvis ikke gå galt ved hjælp af en StringBuilder, men allokere den korrekte størrelse på forhånd, hvis det er kendt. Uden for løkker skal du holde fast ved "+", når det er mere læsbart; og stoler på, at JVM er, eller snart vil være, bedre til at optimere end dig.