2013-03-18 2 views
3

Я просмотрел скомпилированный код с помощью командной строки javac, и я видел, когда я использовал конкатенацию String с оператором +, скомпилированный код заменен на метод append() StringBuilder. теперь я думаю, что использование StringBuilder и String конкатенации имеют одинаковую производительность, потому что они имеют аналогичный байт-код, правильно ли это?java: String concat в байт-коде, преобразованный в StringBuilder

ответ

11

Да, это правда! Но когда вы конкатенируете в цикле, поведение отличается. например

String str = "Some string"; 
for (int i = 0; i < 10; i++) { 
    str += i; 
} 

новый StringBuilder будут построены на каждой итерации цикла (с начальным значением ул) и в конце каждой итерации будет конкатенации с начальным String (фактически StringBuilder с начальным значением str).
Итак, вам нужно создать StringBuilder самостоятельно, только когда вы работаете с конкатенацией String в цикле.

0

Основное отличие (и причина, по которой компилятор использует StringBuilder для конкатенации строк) состоит в том, что String неизменен, тогда как StringBuilder нет.

Например, для вычисления s1 + s2 + s3, используя только строки, требуется копировать символы s1 дважды. Этого можно избежать (и) избежать, используя StringBuilder.

Эта оптимизация явно разрешено JLS:

Реализация может выполнять преобразование и конкатенацию в один шаг, чтобы избежать создания и удаления промежуточного объекта String. Чтобы увеличить производительность повторной конкатенации строк, компилятор Java может использовать класс StringBuffer или подобный метод для уменьшения количества промежуточных объектов String, созданных при оценке выражения.

Смежные вопросы