Классы String и StringBuffer по отношению к методу append()

Я цитирую книгу Герберта Шилдта по Java, Обработка строк главы ,

Метод append( ) чаще всего вызывается, когда оператор + используется для объектов String. Java автоматически изменяет модификации экземпляра String на аналогичные операции над экземпляром StringBuffer. Таким образом, конкатенация вызывает append( ) для объекта StringBuffer.

Я очень хорошо знаю, что конкатенация вызывает append( ) для экземпляра StringBuffer. Что автор имеет в виду, говоря, что «метод append( ) чаще всего вызывается, когда оператор + используется для объектов String»? Насколько я понимаю, «append()» нельзя использовать со строками.

После выполнения конкатенации компилятор вставляет вызов toString( ), чтобы превратить изменяемый StringBuffer обратно в постоянную строку. Все это может показаться неоправданно сложным. Почему бы просто не иметь один строковый класс и вести себя более или менее как StringBuffer? Ответ — производительность. Есть много оптимизаций, которые среда выполнения Java может сделать, зная, что объекты String неизменяемы. К счастью, Java скрывает большую часть сложности преобразования между строками и буферами строк. На самом деле, многие программисты никогда не почувствуют необходимости использовать StringBuffer напрямую и смогут выражать большинство операций с помощью оператора + над строковыми переменными.

Я хочу знать, какие оптимизации может выполнить среда выполнения Java, зная, что объекты String неизменяемы?

Работа с кодом всегда дает мне лучшее понимание упомянутой проблемы?


person Farhan Shirgill Ansari    schedule 16.10.2014    source источник
comment
Компилятор Java заменит + на StringBuffer (на самом деле теперь это StringBuilder) и вызовет append.   -  person Elliott Frisch    schedule 16.10.2014
comment
Хочет ли он сказать что-то вроде этого String s1; s1 = sb.append(a = ).append(a).append(!).toString();   -  person Farhan Shirgill Ansari    schedule 16.10.2014
comment
Компилятор заменит String s1 = "a = " + a + "!"; чем-то подобным; да.   -  person Elliott Frisch    schedule 16.10.2014


Ответы (1)


Я хочу знать, какие оптимизации может выполнить среда выполнения Java, зная, что объекты String неизменяемы?

Во-первых, есть пул строк — любые строковые литералы в вашей программе будут интернированы; разные классы, которые ссылаются на строковые литералы с одинаковым содержимым, будут просто ссылаться на один и тот же объект в памяти.

В более сумасшедших новостях есть параметр в последних версиях сборщика мусора Java, где при определенных условиях сборщик мусора обнаружит несколько объектов String с одинаковым содержимым и отредактирует их, чтобы они указывали на одну и ту же основу char[]. Это возможно только потому, что строки неизменяемы и позволяют сборщику мусора молча (с сохранением семантики) уменьшать потребление памяти.

person Louis Wasserman    schedule 16.10.2014