Я цитирую книгу Герберта Шилдта по Java, Обработка строк главы ,
Метод
append( )
чаще всего вызывается, когда оператор+
используется для объектов String. Java автоматически изменяет модификации экземпляра String на аналогичные операции над экземпляром StringBuffer. Таким образом, конкатенация вызываетappend( )
для объекта StringBuffer.
Я очень хорошо знаю, что конкатенация вызывает append( )
для экземпляра StringBuffer. Что автор имеет в виду, говоря, что «метод append( )
чаще всего вызывается, когда оператор +
используется для объектов String»? Насколько я понимаю, «append()» нельзя использовать со строками.
После выполнения конкатенации компилятор вставляет вызов
toString( )
, чтобы превратить изменяемый StringBuffer обратно в постоянную строку. Все это может показаться неоправданно сложным. Почему бы просто не иметь один строковый класс и вести себя более или менее как StringBuffer? Ответ — производительность. Есть много оптимизаций, которые среда выполнения Java может сделать, зная, что объекты String неизменяемы. К счастью, Java скрывает большую часть сложности преобразования между строками и буферами строк. На самом деле, многие программисты никогда не почувствуют необходимости использовать StringBuffer напрямую и смогут выражать большинство операций с помощью оператора + над строковыми переменными.
Я хочу знать, какие оптимизации может выполнить среда выполнения Java, зная, что объекты String неизменяемы?
Работа с кодом всегда дает мне лучшее понимание упомянутой проблемы?
String s1 = "a = " + a + "!";
чем-то подобным; да. - person Elliott Frisch   schedule 16.10.2014