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 создавать кучу новых строк, чтобы она могла закончиться финальной строкой для добавления в буфер, Это часто упущенная память, и я видел значительные улучшения в использовании памяти в веб-приложениях, устраняя этот тип кода.