Выбор ответа Junior String и пул строк спрашивают часто обновлено

Конкатенация в цикле

Вопрос

Почему res += s в цикле на 100 000 итераций работает медленно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Каждая итерация копирует всё накопленное: суммарно O(n²). String неизменяем, поэтому res += s создаёт новую строку длиной res + s и копирует символы.

Варианты ответа

  1. Оператор + для строк синхронизирован, как методы StringBuffer
  2. JVM каждый раз кладёт результат конкатенации в пул строк
  3. Это не медленно: JIT превращает весь цикл в один StringBuilder
  4. Каждая итерация копирует всё накопленное: суммарно O(n²)правильный ответ

Разбор

String неизменяем, поэтому res += s создаёт новую строку длиной |res| + |s| и копирует символы. Сумма копирований растёт квадратично. Решение: один StringBuilder на весь цикл. Синхронизации у + нет (это у StringBuffer), результаты конкатенации в рантайме в пул не попадают. Компилятор оптимизирует одно выражение, но не превращает весь цикл в один билдер.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме