Почему StringBuilder не создает лишних объектов String в куче при конкатенации?

«Почему StringBuilder не создает лишних объектов String в куче при конкатенации?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

StringBuilder минимизирует создание объектов благодаря изменяемому внутреннему буферу (массиву char[]). В отличие от операции конкатенации строк (+), которая каждый раз создает новый неизменяемый объект String, StringBuilder модифицирует содержимое своего буфера.

Ключевой механизм:

  1. При создании StringBuilder инициализируется с буфером определенной емкости.
  2. Метод append() добавляет данные в этот буфер. Если места не хватает, буфер расширяется (обычно по формуле новая_емкость = (старая_емкость * 2) + 2), что все равно происходит гораздо реже, чем создание нового String при каждой конкатенации.
  3. Финальная строка создается только при вызове toString().

Сравнение на примере:

Неэффективно с + (в цикле):

String result = "";
for (int i = 0; i < 100; i++) {
    result += i; // На КАЖДОЙ итерации создается новый String!
}

Эффективно с StringBuilder (в цикле):

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
    sb.append(i); // Данные добавляются в существующий буфер
}
String result = sb.toString(); // Создается только один итоговый String

Вывод: StringBuilder следует использовать для многократной конкатенации строк, особенно в циклах, чтобы избежать накладных расходов на создание и сборку мусора от промежуточных объектов String.