StringBuilder добавление против + - PullRequest
13 голосов
/ 25 октября 2011

В чем разница между этими двумя строками?

stringBuilder.append("Text " + counter + " more text");
stringBuilder.append("Text ").append(counter).append(" more text");

Предполагая, что счетчик является инкрементным целым, создает ли первая строка при каждом вызове строку "Text 0 more text", "Text 1 more text" и т. Д., А вторая строка создает только эти две строки один раз: "Text " и " more text"? Это правильно?

Ответы [ 5 ]

15 голосов
/ 25 октября 2011

Короче говоря, да, за исключением того, что одни и те же строковые литералы для "Text " и " more text" используются повторно каждый раз.

Второй вариант более эффективен, поскольку он записывает каждый из трех компонентов непосредственно в StringBuilder.

Напротив, первый вариант создает другой - безымянный - StringBuilder, записывает в него три компонента, вызывает его метод toString() и записывает результат в именованный stringBuilder.

Таким образом, первый вариант создает дополнительный объект StringBuilder и дополнительный объект String и копирует строковые данные в два раза больше, чем второй вариант.

3 голосов
/ 25 октября 2011

Да, это (в основном) правильно.

На самом деле, вторая вообще не создает новых строк, потому что каждый раз использует одни и те же строки. Он будет использовать интернированные версии строк «Текст» и «больше текста».

Первый создаст строку для «Текст 1 больше текста», а затем «Текст 2 больше текста», используя StringBuilder, сгенерированный компилятором.

1 голос
/ 25 октября 2011

Это зависит от того, интернирует ли Java строки или нет, но все равно неэффективно.

Строки являются неизменяемыми, поэтому, если вы используете .append («String» + что-то + «String»), вы заставляете Java создавать кучу новых строк, чтобы она могла в итоге получить последнюю строку для добавления в буфер , Это часто пропускаемая проблема с памятью, и я видел значительные улучшения в использовании памяти в веб-приложениях за счет исключения кода такого типа.

1 голос
/ 25 октября 2011

Это почти правильно.

Я бы сказал больше.Поскольку строка Java кэширует все жестко закодированные строки, экземпляр строк «Текст» и «больше текста» не создается на каждой итерации.

1 голос
/ 25 октября 2011

Да, ваша интерпретация (почти) правильная.

Первая строка всегда создает объект String, например "Text 0 more text", а вторая не создает такой String object.

Вторая строка не создает * любые * String объекты вообще "Text " и " more text" являются String литералами, которые не делают воссоздается при каждом выполнении этой строки.Они создаются только один раз.

В обоих случаях эффект на stringBuilder одинаков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...