myślę wykorzystanie StringBuilder
vs +
naprawdę zależy od kontekstu używasz go.
Ogólnie użyciu JDK 1.6 i powyżej kompilator automatycznie dołączyć ciągi razem używając StringBuilder
.
String one = "abc";
String two = "xyz";
String three = one + two;
To będzie skompilować String three
jak:
String three = new StringBuilder().append(one).append(two).toString();
Jest to bardzo pomocne i oszczędza nam czas pracy. Jednak ten proces nie zawsze jest optymalny. Weźmy na przykład:
String out = "";
for(int i = 0; i < 10000 ; i++) {
out = out + i;
}
return out;
Jeśli skompilować do kodu bajtowego, a następnie dekompilacji kodu bajtowego generowane otrzymujemy coś takiego:
String out = "";
for(int i = 0; i < 10000; i++) {
out = new StringBuilder().append(out).append(i).toString();
}
return out;
Kompilator został zoptymalizowany wewnętrznej pętli, ale z pewnością nie popełnił najlepszych możliwych optymalizacje .Aby poprawić nasz kod możemy użyć:
StringBuilder out = new StringBuilder();
for(int i = 0 ; i < 10000; i++) {
out.append(i);
}
return out.toString();
Teraz jest to bardziej optymalne niż kompilator wygenerowany kod, więc nie jest to z pewnością trzeba pisać kod za pomocą StringBuilder
/StringBuffer
zajęcia w przypadkach, gdy wymagana jest wydajny kod. Obecne kompilatory nie radzą sobie z łączeniem łańcuchów w pętlach, jednak może się to zmienić w przyszłości.
Należy uważnie sprawdzić, gdzie trzeba ręcznie zastosować StringBuilder
i spróbować go użyć, jeśli nie zmniejszy to czytelności kodu.
Uwaga: Skompilowałem kod przy użyciu JDK 1.6 i dekompilowałem kod przy pomocy programu javap
, który wypisuje kod bajtowy. Jest dość łatwy do zinterpretowania i często jest użytecznym odniesieniem do próby optymalizacji kodu. Kompilator zmienia kod za kulisami, więc zawsze jest ciekawie zobaczyć, co robi!
Oto dobra analiza: http://www.javacodegeeks.com/2013/03/java-stringbuilder-myth-debunked.html – marcolopes