StringBuilder добавляет vs +
В чем разница между этими двумя строками?
stringBuilder.append("Text " + counter + " more text");
stringBuilder.append("Text ").append(counter).append(" more text");
Предполагая, что счетчик является инкрементирующим int, делает ли первая строка строкой "Text 0 more text"
, "Text 1 more text"
и т.д. каждый раз, когда она вызывается, а вторая строка создает только эти две строки один раз: "Text "
и " more text"
? Правильно ли это?
Ответы
Ответ 1
В двух словах, да, за исключением того, что одни и те же строковые литералы для "Text "
и " more text"
будут повторно использоваться каждый раз.
Второй вариант более эффективен, поскольку он записывает каждый из трех компонентов непосредственно в StringBuilder
.
В отличие от этого первый вариант создает другой - unnamed - StringBuilder
, записывает в него три компонента, вызывает его метод toString()
и записывает результат в названный StringBuilder
.
В итоге первый вариант создает дополнительный объект StringBuilder
и дополнительный объект String
и копирует строковые данные в два раза больше, чем второй вариант.
Ответ 2
Да, это (в основном) правильно.
Фактически, второй не создает новые строки вообще, потому что каждый раз он повторно использует одни и те же строки. Он будет использовать интернированные версии строк "Текст" и "больше текста".
Первая создаст строку для "Text 1 more text", затем "Text 2 more text", используя StringBuilder, сгенерированный компилятором.
Ответ 3
Да, ваша интерпретация (почти) правильная.
В первой строке всегда создается объект String
, например "Text 0 more text"
, а второй не создает такой объект String
.
Вторая строка не создает * любые * String
объекты вообще "Text "
и " more text"
- это String
литералы, которые не воссоздаются каждый раз при выполнении этой строки. Они создаются только один раз.
Эффект на stringBuilder
в обоих случаях точно такой же.
Ответ 4
Это почти правильно.
Я бы сказал больше. Поскольку строка java кэширует все жестко закодированные строки, экземпляр строк "Текст" и "больше текста" не создается на каждой итерации.
Ответ 5
Это зависит от того, будет ли Java ставить строки или нет, но она все еще неэффективна.
Строки неизменяемы, поэтому, если вы используете .append( "String" + something + "String" ), вы вынуждаете Java создавать кучу новых строк, чтобы она могла закончиться финальной строкой для добавления в буфер, Это часто упущенная память, и я видел значительные улучшения в использовании памяти в веб-приложениях, устраняя этот тип кода.