2011-12-18 11 views
14

Czytałem tę stronę dokumentacji, http://developer.android.com/reference/android/util/Log.html.Android StringBuilder vs String Concatenation

Sekcja tu wpadła mi w oko:

Wskazówka: Nie należy zapominać, że po dokonaniu połączenia jak

Log.v(TAG, "index=" + i);

że kiedy budujemy ciąg przejść do Log.d, kompilator używa StringBuilder i pojawiają się co najmniej trzy alokacje: sama StringBuilder, bufor i obiekt String. Realistycznie, istnieje również inny przydział i kopia bufora, a jeszcze bardziej presja na gc jest . Oznacza to, że jeśli Twój komunikat dziennika jest odfiltrowany , być może wykonujesz znaczną pracę i ponosisz znaczny nadmiar na poziomie .

Oznacza to, że kompilator systemu Android pobiera ciągi konkatenacji (+) i konwertuje je na instrukcje StringBuilder i append.

Czy moje założenie jest poprawne, czy nadal lepiej jest używać StringBuilder ręcznie zamiast łączenia ciągów?

+0

możliwe łączenie duplikat [String Java - kiedy użyć +, StringBuilder i concat] (http://stackoverflow.com/ pytania/7817951/string-concatenation-in-java-when-to-use-stringbuilder-and-concat) – givanse

Odpowiedz

9

Kompilator wykonuje dokładnie to, co sugerujesz. Możesz wydrukować bajtów wygenerowanego pliku .class (używając javap -c) i zobaczyć wywołania, aby utworzyć i użyć StringBuilder.

Jednak generalnie warto robić to ręcznie, gdy konkatenacje ciągów są rozłożone na kilka linii kodu. Kompilator zwykle przydziela oddzielne StringBuilder dla każdego wyrażenia o wartości String z udziałem +.

+0

Robiłem to źle przez cały ten czas. >< –

+1

@JeremyEdwards - Heh. Powiedziałem to o wielu rzeczach. :) –

+2

** "Generalnie warto robić to ręcznie, gdy konkatenacje ciągów są rozłożone na kilka linii kodu" ** - Chciałem tylko podkreślić, co @TedHopp powiedział, aby nie został utracony. Łączę ciąg znaków o długości 250 znaków w około 10 liniach, a czas procesora w App Engine to 350 msek. Kiedy zastąpiłem to pojedynczym StringBuilderem, czas spadł do 50 ms, a inne rzeczy pozostały niezmienione. –

1

Odpowiedź Teda Hoppa jest dobra, ale przeczytanie jej zajęło kilka razy. Oto sformułowana odpowiedź, która, mam nadzieję, jest bardziej jasna.

Łączenie ciągów (tj. Za pomocą +, jak w String myString = "Hello " + "World";) używa w tle StringBuilder wraz z innymi przydziałami. Tak więc, dla niczego innego niż proste jednorazowe łączenie, lepiej byłoby samemu użyć StringBuilder.

Przykładowo

StringBuilder myString = new StringBuilder(); 
myString.append("Hello "); 
myString.append("to "); 
myString.append("everyone "); 
myString.append("in "); 
myString.append("the "); 
myString.append("world!"); 

lepiej niż

String myString = "Hello " + "to " + "everyone " + "in " + "the " + "world!"; 
+0

Ale jeśli mój ciąg jest po prostu "" index = "+ i", jaki jest najlepszy sposób?(Dla wydajności) – GMX

+0

@GMX, To dobre pytanie i myślę, że zależałoby to od kontekstu. Jeśli jest to wywoływane nieczęsto, to użycie '" index = "+ i' jest dużo bardziej czytelne niż użycie' StringBuilder'. Jeśli jednak zostanie wywołany 1000 razy wewnątrz pętli, a wydajność jest problemem, to może jakaś opcja 'StringBuilder' będzie lepsza. Głównym punktem przyjętej odpowiedzi było jednak to, że gdy do zbudowania ciągu potrzeba wielu wierszy kodu, zdecydowanie używaj 'StringBuilder'. – Suragch