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?
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.
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
}
}
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