Выбор ответа Junior String и пул строк спрашивают часто обновлено
Конкатенация в цикле
Вопрос
Почему res += s в цикле на 100 000 итераций работает медленно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Каждая итерация копирует всё накопленное: суммарно O(n²). String неизменяем, поэтому res += s создаёт новую строку длиной res + s и копирует символы.
Варианты ответа
- Оператор
+для строк синхронизирован, как методы StringBuffer - JVM каждый раз кладёт результат конкатенации в пул строк
- Это не медленно: JIT превращает весь цикл в один StringBuilder
- Каждая итерация копирует всё накопленное: суммарно O(n²)правильный ответ
Разбор
String неизменяем, поэтому res += s создаёт новую строку длиной |res| + |s| и копирует символы. Сумма копирований растёт квадратично. Решение: один StringBuilder на весь цикл. Синхронизации у + нет (это у StringBuffer), результаты конкатенации в рантайме в пул не попадают. Компилятор оптимизирует одно выражение, но не превращает весь цикл в один билдер.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.