I Java finns det en prestationsskillnad mellan att använda operatören "+" och StringBuilder?


Svar 1:

I Java finns det en prestationsskillnad mellan att använda operatören "+" och StringBuilder?

På en enda rad som dessa:

String string1 = "en" + "två";
String string2 = new StringBuilder (“en”). Append (“två”). ToString ();

Det bör inte finnas någon skillnad i prestanda. I moderna Java-ekosystem optimeras faktiskt det första till det andra vid sammanställningstiden. För att se detta i aktion, prova att gå in i den första med din favoritfelsökare.

Men om dina sammanlänkade strängar på separata linjer eller, till exempel, i en för-loop:

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

för (heltal i = 0; i <5; i ++) {
  string1 = string1 + i.toString ();
  sb.append (i.toString ());
}

Strängsträng2 = sb.toString ();

Att använda en StringBuilder är sedan mer "effektiv" och är ibland det föredragna sättet att bygga en mer komplex sträng. Så vitt jag vet kommer ingen Java-kompilator för närvarande att optimera upprepning av + till StringBuilder.


Svar 2:

Kort svar: det kan finnas, men för det mesta är det inte värt att oroa sig för. Gör tydlig kod framför för tidig optimering.

Moderna JVM: er kan optimera String-sammanlänkningen med "+" och förvandla den till en StringBuilder, och eftersom de kan se hur länge den resulterande strängen kommer att bli, kan de tilldela rätt storlek till StringBuilder i början. Om du själv skapar en StringBuilder med standardmatrisstorleken, kan kanske arrayen förstoras senare, vilket innebär en matriskopia, så det kan faktiskt vara långsammare.

Sedan Java 9 är String-sammanlänkning mycket mer optimerad med en strategi som beslutas vid körning.

Om du flera gånger lägger till en sträng i en slinga kan du förmodligen inte gå fel med en StringBuilder, men tilldela rätt storlek i förväg om det är känt. Utanför öglorna, håll fast vid "+" när det skulle vara mer läsbart; och lita på att JVM är, eller snart kommer att bli bättre på att optimera än du.