Когда использовать StringBuilder в Java

Предполагается, что обычно предпочтительнее использовать StringBuilder для конкатенации строк в Java. Это всегда так?

Я имею в виду следующее: накладные расходы на создание объекта StringBuilder , вызов метода append() и, наконец, toString() уже меньше, чем объединение существующих строк с помощью оператора + для двух строк или это целесообразно только для большего (чем два ) строки?

Если есть такой порог, от чего он зависит (возможно, длина строки, но каким образом)?

И, наконец, вы могли бы обменять читабельность и краткость конкатенации + для производительности StringBuilder в меньших случаях, таких как две, три или четыре строки?

Явное использование StringBuilder для регулярных конкатенаций упоминается как устаревшее в устаревших советах по оптимизации Java, а также в городских мифах Java .

Если вы используете конкатенацию String в цикле, что-то вроде этого,

 String s = ""; for (int i = 0; i < 100; i++) { s += ", " + i; } 

то вместо String следует использовать StringBuilder (а не StringBuffer ), потому что он намного быстрее и потребляет меньше памяти.

Если у вас есть один оператор,

 String s = "1, " + "2, " + "3, " + "4, " ...; 

то вы можете использовать String s, потому что компилятор будет автоматически использовать StringBuilder .

Ответ Ральфа сказочный. Я предпочел бы использовать class StringBuilder для создания / украшения String, потому что его использование больше похоже на шаблон Builder.

 public String decorateTheString(String orgStr){ StringBuilder builder = new StringBuilder(); builder.append(orgStr); builder.deleteCharAt(orgStr.length()-1); builder.insert(0,builder.hashCode()); return builder.toString(); } 

Он может использоваться как помощник / построитель для построения строки, а не самой строки.

Как правило, всегда используйте более читаемый код и только рефакторинг, если производительность является проблемой. В этом конкретном случае самые последние JDK фактически оптимизируют код в версии StringBuilder в любом случае.

Обычно вам просто нужно делать это вручную, если вы выполняете конкатенацию строк в цикле или в каком-то сложном коде, который компилятор не может легко оптимизировать.

Посмотрите: http://www.javaspecialists.eu/archive/Issue068.html и http://www.javaspecialists.eu/archive/Issue105.html

Проделайте те же тесты в своей среде и проверьте, улучшает ли более новый JDK или вашу реализацию Java некоторую операцию строковой последовательности с помощью String или лучше с помощью StringBuilder .

Некоторые компиляторы не могут заменить какие-либо конкатенации строк эквивалентами StringBuilder. Обязательно рассмотрите, какие компиляторы будут использовать ваш источник, прежде чем использовать оптимизацию времени компиляции.

Оператор + использует public String concat(String str) внутри. Этот метод копирует символы двух строк, поэтому он имеет требования к памяти и сложность выполнения, пропорциональные длине двух строк. StringBuilder работает более эффективно.

Однако я прочитал здесь, что код конкатенации, использующий оператор +, изменяется на StringBuilder на постсоветских компиляторах. Так что это может быть не проблема. (Хотя я бы действительно проверял это утверждение, если бы я зависел от него в моем коде!)

Для двух строк concat быстрее, в других случаях StringBuilder – лучший выбор, см. Мое объяснение в операторе конкатенации (+) vs concat ()

Проблема с конкатенацией String заключается в том, что она приводит к копированию объекта String со всеми соответствующими затратами. StringBuilder не является streamобезопасным и, следовательно, быстрее, чем StringBuffer, который раньше был предпочтительным выбором до Java 5. Как правило, вы не должны конкатенации строк в цикле, который будет вызываться часто. Я думаю, что здесь можно сделать несколько конкатенаций, и вам не будет больно, если вы не говорите о сотнях, и это, конечно, зависит от ваших требований к производительности. Если вы делаете вещи в реальном времени, вы должны быть очень осторожны.

Материалы сертификации Microsoft рассматривают этот же вопрос. В мире .NET накладные расходы для объекта StringBuilder упрощают объединение двух объектов String. Я бы предположил аналогичный ответ для строк Java.

  • Как отформатировать строку Java с начальным нулем?
  • Доступ к случайному элементу в списке
  • Является ли строка Java действительно неизменной?
  • Как проверить, существует ли строка в файле с Bash?
  • Как форматировать строки в Java
  • Сравнение строки с пустой строкой (Java)
  • Строка макроопределения
  • String.Format не работает в TypeScript
  • Обращение строки в C
  • Форматировать строки в методе Console.WriteLine
  • Как присвоить данные для команды curl?
  • Interesting Posts

    Разница между масштабированием по горизонтали и вертикали для баз данных

    Область действия объекта исключения в C ++

    Есть ли слушатель, когда WebView отображает его содержимое?

    настраиваемое listview с использованием classа arrayadapter в android

    Как отключить команду + q для терминала на OSX

    Инициализация платформы Entity – SLOW – что я могу сделать, чтобы быстрее запустить ее?

    Нажмите кнопку переключения с помощью jQuery

    Летучие Vs Статические в java

    Неустранимая ошибка: вызов неопределенной функции sqlsrv_connect ()

    Я пожарил мою материнскую плату или мой блок питания?

    Динамические свойства Objective-C во время выполнения?

    Как заставить пользователя регистрироваться на моем сайте в течение нескольких месяцев?

    Использование явно пронумерованного повторения вместо вопросительного знака, звезды и плюс

    Преобразование формата pyspark в формат даты

    Windows 10: панель мониторинга первичного монитора не скрывается

    Давайте будем гением компьютера.