Ответ вслух Junior String и пул строк обновлено

Зачем нужен StringBuilder

Вопрос

Когда нужен StringBuilder, а когда достаточно +?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Для одного выражения вроде "id=" + id + ", name=" + name достаточно +: с Java 9 компилятор генерирует invokedynamic и StringConcatFactory склеивает всё за один проход.

Что должно прозвучать в ответе

  • String неизменяем, каждая склейка создаёт новую строку

  • В цикле `+=` даёт квадратичное копирование

  • Одно выражение с `+` компилятор оптимизирует сам (invokedynamic с Java 9)

  • StringBuilder не синхронизирован, StringBuffer синхронизирован

  • Для коллекций String.join или Collectors.joining

Что могут спросить следом

  • Зачем задавать начальную ёмкость StringBuilder?
  • Что быстрее: String.format или конкатенация?

Разбор

Для одного выражения вроде "id=" + id + ", name=" + name достаточно +: с Java 9 компилятор генерирует invokedynamic и StringConcatFactory склеивает всё за один проход. Проблема в циклах: строка неизменяема, res += x каждый раз создаёт новую строку и копирует накопленное, на больших объёмах это квадратичное время и много мусора. Там беру один StringBuilder, при известном размере задаю ёмкость, чтобы не было перевыделений. StringBuffer то же самое, но с синхронизацией, сейчас почти не нужен. Для склейки коллекции через разделитель удобнее String.join или Collectors.joining.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме