В чём разница между String, StringBuffer и StringBuilder в Java?

Ключевые различия String, StringBuffer и StringBuilder String — неизменяемая строка (immutable): после изменения создаётся новый объект StringBuffer — изменяемая строка с потокобезопасной синхронизацией (synchronized)…

Короткий ответ

Что ответить на собеседовании

Ключевые различия String, StringBuffer и StringBuilder String — неизменяемая строка (immutable): после изменения создаётся новый объект StringBuffer — изменяемая строка с потокобезопасной синхронизацией (synchronized) StringBuilder — изменяемая строка, аналогичная StringBuffer, но без синхронизации; поэтому в однопоточных задачах работает быстрее StringBuffer и StringBuilder рационально применять при многократном изменении строки и выполнении конкатенаций String подходит для фиксированных значений, StringBuilder — для быстрой модификации в одном потоке, а StringBuffer — для многопоточной среды Ключевое отличие связано с потокобезопасностью…

Подробный разбор

Ответ с пояснениями

Ключевые различия String, StringBuffer и StringBuilder

  • Stringнеизменяемая строка (immutable): после изменения создаётся новый объект
  • StringBufferизменяемая строка с потокобезопасной синхронизацией (synchronized)
  • StringBuilder — изменяемая строка, аналогичная StringBuffer, но без синхронизации; поэтому в однопоточных задачах работает быстрее
  • StringBuffer и StringBuilder рационально применять при многократном изменении строки и выполнении конкатенаций
  • String подходит для фиксированных значений, StringBuilder — для быстрой модификации в одном потоке, а StringBuffer — для многопоточной среды
  • Ключевое отличие связано с потокобезопасностью и производительностью
  • Конкретный выбор определяется условиями параллельного выполнения и требованиями к производительности

Подробный ответ

Основной ответ

String, StringBuffer и StringBuilder — классы Java, предназначенные для работы со строками. Они отличаются тем, можно ли изменять их содержимое и обеспечивают ли они потокобезопасность. Объект String является неизменяемым (immutable), тогда как StringBuffer и StringBuilder — изменяемые (mutable) строки, позволяющие обновлять содержимое без создания нового объекта при каждой операции. Основная разница между StringBuffer и StringBuilder заключается в потокобезопасности: StringBuffer использует синхронизацию (thread-safe), а StringBuilder синхронизации не имеет. Благодаря этому StringBuilder быстрее, но не предназначен для безопасной совместной работы из нескольких потоков.

Ключевые моменты

  • String — immutable-объект: при каждом изменении формируется новый объект. При большом количестве операций конкатенации это может приводить к дополнительным затратам.
  • StringBuffer — mutable-класс с синхронизацией. Он подходит многопоточным приложениям, в которых необходимо безопасно работать с данными при параллельном доступе, однако сама синхронизация снижает производительность.
  • StringBuilder — mutable-класс без синхронизации. Он оптимален для однопоточных приложений и локальных методов, где защита от параллельного доступа не требуется. За счёт отсутствия overhead на синхронизацию StringBuilder работает на 20-30% быстрее StringBuffer.

Практический контекст

В современных приложениях, особенно в Java 5 и последующих версиях, для формирования строк в однопоточной среде обычно выбирают StringBuilder, например внутри отдельного метода. Для многопоточного контекста используют StringBuffer либо более комплексные механизмы синхронизации. Когда строка является константой или выполняется небольшая операция, предпочтителен String — он обеспечивает безопасность и сохраняет читабельность кода. Так, при формировании SQL-запросов или логических сообщений часто применяют именно StringBuilder, поскольку он эффективнее.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку