Получить доступ

Чем String, StringBuilder и StringBuffer отличаются?

JuniorОсновы языка
Коротко

String неизменяем: каждая «правка» — новый объект. StringBuilder — изменяемый буфер, быстрый, не потокобезопасный. StringBuffer — то же, но с synchronized на каждом методе — устаревший вариант.

  • Конкатенация в цикле — StringBuilder, иначе квадратичная работа
  • Одно выражение a + b + c компилятор оптимизирует сам
  • StringBuffer почти не нужен: буфер редко делят между потоками

А ещё Известный размер — new StringBuilder(capacity)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

String s = "";
for (int i = 0; i < n; i++) s += i;        // n новых строк, O(n²)

StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) sb.append(i);  // один растущий буфер
String result = sb.toString();

StringBuilder хранит массив и растёт удвоением, как ArrayList. Методы возвращают this — цепочки append(a).append(b). Есть insert, reverse, deleteCharAt.

StringBuffer появился в Java 1.0, StringBuilder — в Java 5 как его несинхронизированная замена. Синхронизация на каждом append почти никогда не нужна: строку собирают в одном потоке.

Компилятор превращает "a" + x + "b" в эффективную конкатенацию (Java 9+: StringConcatFactory), поэтому вне циклов + нормален и читается лучше. Для соединения коллекции — String.join или Collectors.joining.

Что хотят услышать

  • Изменяемость и потокобезопасность каждого.
  • Почему конкатенация в цикле плоха.

Частые ошибки

  • Собирать большие строки в цикле через +=.
  • Думать, что StringBuilder потокобезопасен.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗StringBuilder неизменяем, а String изменяем
  • ✓String неизменяем; StringBuilder — изменяемый буфер (быстрый, несинхронизированный); StringBuffer — синхронизированный аналог
  • ✗StringBuffer быстрее StringBuilder в одном потоке
  • ✗Все три неизменяемы

Что спросят дальше

  • Что такое string pool?
  • Как работает intern()?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем