Для каких сценариев в Java следует использовать StringBuffer вместо StringBuilder или String?

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

Ответ

StringBuffer — это потокобезопасный (thread-safe), изменяемый (mutable) класс для работы с последовательностями символов.

Когда использовать StringBuffer:

  • Многопоточная среда: Когда один и тот же буфер может изменяться несколькими потоками одновременно. Его методы синхронизированы (synchronized).
  • Частая модификация строки: Когда требуется множество операций (добавление, вставка, удаление) с одной строкой, чтобы избежать создания множества неизменяемых объектов String.

Сравнение с аналогами:

Класс Изменяемость Потокобезопасность Производительность
String Нет (immutable) Да (по умолчанию) Низкая при частой конкатенации
StringBuffer Да (mutable) Да (синхронизирован) Средняя (из-за накладных расходов на синхронизацию)
StringBuilder Да (mutable) Нет Высокая (оптимален для однопоточного кода)

Пример использования StringBuffer:

StringBuffer buffer = new StringBuffer();
buffer.append("Hello");
buffer.append(" ");
buffer.append("World");
// В многопоточном контексте эти операции безопасны
String result = buffer.toString(); // "Hello World"

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