Я думаю, что использование StringBuilder
против +
действительно зависит от контекста, вы используете его.
В целом с использованием JDK 1.6 и выше компилятор автоматически соединит строки вместе, используя StringBuilder
.
String one = "abc";
String two = "xyz";
String three = one + two;
будет скомпилирован String three
как:
String three = new StringBuilder().append(one).append(two).toString();
Это весьма полезно и экономит некоторое время работы. Однако этот процесс не всегда оптимален. Возьмем, к примеру:
String out = "";
for(int i = 0; i < 10000 ; i++) {
out = out + i;
}
return out;
Если компилировать байткод, а затем декомпилировать байт-код генерируется мы получаем что-то вроде:
String out = "";
for(int i = 0; i < 10000; i++) {
out = new StringBuilder().append(out).append(i).toString();
}
return out;
компилятор оптимизировал внутреннюю петлю, но, конечно, не сделал лучшие возможности оптимизации ,Для того, чтобы улучшить наш код, который мы могли бы использовать:
StringBuilder out = new StringBuilder();
for(int i = 0 ; i < 10000; i++) {
out.append(i);
}
return out.toString();
Теперь это более оптимальным, чем компилятор сгенерированный код, так что, безусловно, нужно писать код, используя классы StringBuilder
/StringBuffer
в тех случаях, когда требуется эффективный код. Текущие компиляторы не очень эффективны при конкатенации строк в цикле, однако это может измениться в будущем.
Вам необходимо внимательно посмотреть, где вам нужно вручную применить StringBuilder
и попытаться использовать его там, где он не уменьшит читаемость вашего кода.
Примечание. Я скомпилировал код с использованием JDK 1.6 и декомпилировал код с помощью программы javap
, которая выплевывает байт-код. Его довольно легко интерпретировать и часто полезно использовать при попытке оптимизировать код. Компилятор меняет ваш код за кулисами, поэтому всегда интересно посмотреть, что он делает!
Вот хороший анализ: http://www.javacodegeeks.com/2013/03/java-stringbuilder-myth-debunked.html – marcolopes