Зачем нужен StringBuilder
Вопрос
Когда нужен StringBuilder, а когда достаточно +?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.