Po co używać stringbuildera jawnie, jeśli kompilator automatycznie konwertuje konkatenację łańcuchów na StringBuilder? [duplikat]

Możliwy duplikat:
StringBuilder vs string concatenation w ToString () w Javie

Zastanawiam się, ponieważ kompilator wewnętrznie używa Stringbuildera do dołączania 2 ciągów podczas wykonywania konkatenacji łańcuchowej, to jaki jest sens i dlaczego powinienem używać Stringbuildera, jeśli konkatenacja łańcuchowa już wykonała zadanie dla Ciebie? Czy są jakieś inne konkretne powody?

Author: Community, 2012-08-14

2 answers

Jak już wspomniałeś, nie powinieneś używać StringBuilder zamiast prostego wyrażenia konkatenacyjnego, takiego jak a + " = " + b. Ten ostatni jest szybszy w pisaniu, łatwiejszy do odczytania, a kompilator i tak użyje StringBuilder wewnętrznie, więc przepisanie go nie ma przewagi wydajnościowej.

Jednak {[2] } jest przydatne, jeśli łączysz dużą liczbę łańcuchów w pętli. Poniższy kod jest nieefektywny. Wymaga O (n2) Czas na uruchomienie i tworzy wiele tymczasowych ciągów.

String result = "";
for (int i = 0; i < foo.length; ++i)
{
    result += bar(foo[i]);  // Bad
}

Spróbuj to zamiast:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < foo.length; ++i)
{
    sb.append(bar(foo[i]));
}
String result = sb.toString();

Kompilator optymalizuje tylko proste a + b + c wyrażenia. Nie może automatycznie zoptymalizować powyższego kodu.

 57
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-13 21:32:08

Gdzie zakładasz, że string concatination używa stringbuildera wewnętrznie? Może prosty Konkatedra zostanie zoptymalizowany, ale na pewno nie:

String s = "";

for (int i = 0; i < 1000; i++){
  for (int j = 0; j < 1000; j++){
    s+= "" + i + j
}
}
 3
Author: Falmarri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-13 21:12:34