Ответ
StringBuilder избегает создания промежуточных объектов строк за счет использования изменяемого (mutable) внутреннего буфера (массива символов char[]).
Проблема конкатенации строк (+):
Каждая операция + со строками создает новый объект String, так как строки в Java неизменяемы (immutable). Это ведет к большим накладным расходам при множественных операциях.
String result = "";
for (int i = 0; i < 1000; i++) {
// На КАЖДОЙ итерации создается новый String
result = result + i; // Плохо для производительности
}
Решение через StringBuilder:
- Внутренний буфер:
StringBuilderработает с одним массивомchar[]. - Изменение на месте: Методы
append(),insert(),replace()модифицируют этот буфер. - Динамическое расширение: При нехватке места буфер автоматически увеличивается (обычно по формуле
новая_длина = старая_длина * 2 + 2). - Единый объект результата: Итоговый
Stringсоздается только один раз при вызовеtoString().
StringBuilder sb = new StringBuilder(); // Создается внутренний буфер
for (int i = 0; i < 1000; i++) {
// Данные добавляются в существующий буфер
sb.append(i); // Промежуточные объекты String не создаются
}
String result = sb.toString(); // Создается финальный String
Ключевое отличие: StringBuilder выполняет операции O(n) по времени в худшем случае (из-за копирования при расширении буфера), в то время как наивная конкатенация в цикле имеет сложность O(n²) из-за постоянного копирования данных в новые строки.