В чем главное отличие StringBuffer
а StringBuilder
? Есть ли проблемы с производительностью при выборе любого из них?
java
stringbuilder
stringbuffer
черный тигр
источник
источник
StringBuilder
быстрее, чемStringBuffer
потому что это не такsynchronized
.Вот простой тест производительности:
Тестовый прогон дает номера
2241 ms
дляStringBuffer
против753 ms
дляStringBuilder
.источник
--> 0
в цикле. Мне потребовалось время, чтобы понять, что это значит. Это то, что на самом деле используется на практике вместо обычного...; i > 0; i--
синтаксиса?i -->
действительно раздражает синтаксис ... Сначала я подумал, что это стрелка из-за комментариев об искусстве ASCII.main()
Ваш тест несправедлив. Там нет разминки.В принципе,
StringBuffer
методы синхронизированы, покаStringBuilder
нет.Операции "почти" одинаковы, но использование синхронизированных методов в одном потоке является излишним.
Это довольно много об этом.
Цитата из StringBuilder API :
Так что это было сделано, чтобы заменить его.
То же самое случилось
Vector
и сArrayList
.источник
Hashtable
иHashMap
.Просто используйте,
StringBuilder
если вы действительно не пытаетесь разделить буфер между потоками.StringBuilder
является несинхронизированным (менее затратным = более эффективным) младшим братом исходного синхронизированногоStringBuffer
класса.StringBuffer
пришел первым Sun заботилась о корректности при любых условиях, поэтому они синхронизировали ее, чтобы на всякий случай сделать ее поточно-ориентированной.StringBuilder
пришел позже. Большинство использованийStringBuffer
были однопоточными и без необходимости платили за синхронизацию.Так
StringBuilder
как это замена дляStringBuffer
синхронизации без синхронизации, между примерами не будет различий.Если будут пытаться доли между потоками, вы можете использовать
StringBuffer
, но рассмотреть вопрос о необходимости синхронизации более высокого уровня, например , может быть , вместо того , чтобы использовать StringBuffer, вы должны синхронизировать методы , которые используют StringBuilder.источник
Сначала давайте увидим сходство : и StringBuilder, и StringBuffer являются изменяемыми. Это означает, что вы можете изменить их содержимое, находясь в одном месте.
Отличия : StringBuffer изменчив и синхронизирован. Где, поскольку StringBuilder является изменяемым, но не синхронизируется по умолчанию.
Значение "синхронизированный" (синхронизация) : когда какая-либо вещь синхронизируется, несколько потоков могут получить к ней доступ и изменить ее без каких-либо проблем или побочных эффектов. StringBuffer синхронизирован, так что вы можете использовать его с несколькими потоками без каких-либо проблем.
Какой использовать когда? StringBuilder: когда вам нужна строка, которую можно изменить, и только один поток обращается к ней и изменяет ее. StringBuffer: когда вам нужна строка, которую можно изменить, и несколько потоков обращаются к ней и изменяют ее.
Примечание : не используйте StringBuffer без необходимости, т. Е. Не используйте его, если только один поток модифицирует и обращается к нему, потому что он имеет много кодов блокировки и разблокировки для синхронизации, которые излишне отнимают процессорное время. Не используйте замки, если это не требуется.
источник
В одиночных потоках StringBuffer не намного медленнее, чем StringBuilder , благодаря оптимизации JVM. А в многопоточности вы не можете безопасно использовать StringBuilder.
Вот мой тест (не тест, просто тест):
Результатов:
строк: 319740 Буферов
: 23
Строителей: 7!
Таким образом, Builders быстрее, чем Buffers, и WAY быстрее, чем конкатенация строк. Теперь давайте используем Executor для нескольких потоков:
Теперь StringBuffers занимают 157 мс на 100000 операций добавления. Это не тот же тест, но по сравнению с предыдущими 37 мс, вы можете смело предположить, что добавления StringBuffers медленнее при использовании многопоточности . Причина в том, что JIT / горячая точка / компилятор / что-то оптимизирует, когда обнаруживает, что нет необходимости проверять блокировки.
Но с StringBuilder у вас есть java.lang.ArrayIndexOutOfBoundsException , потому что параллельный поток пытается добавить что-то, где он не должен.
Вывод: вам не нужно гоняться за StringBuffers. А если у вас есть темы, подумайте о том, что они делают, прежде чем пытаться набрать несколько наносекунд.
источник
withString+="some string"+i+" ; ";
это не эквивалентно двум другим циклам и, следовательно, не является справедливым сравнением.StringBuilder был представлен в Java 1.5, поэтому он не будет работать с более ранними версиями JVM.
Из Javadocs :
источник
StringBuilder
.Вот различия, я заметил:
StringBuffer: -
StringBuilder: -
Общая вещь: -
источник
StringBuffer
StringBuilder
StringBuffer
без каких-либо других измененийисточник
append
два раза, илиappend
иtoString
не не безопасно.StringBuilder не является потокобезопасным. Строковый буфер есть. Больше информации здесь .
РЕДАКТИРОВАТЬ: Что касается производительности, после запуска горячей точки , StringBuilder является победителем. Однако для небольших итераций разница в производительности незначительна.
источник
StringBuilder
иStringBuffer
почти одинаковы. Разница в том, чтоStringBuffer
синхронизируется иStringBuilder
нет. ХотяStringBuilder
быстрееStringBuffer
, разница в производительности очень мала.StringBuilder
является заменой СОЛНЦАStringBuffer
. Он просто избегает синхронизации со всеми общедоступными методами. Вместо этого их функциональность одинакова.Пример хорошего использования:
Если ваш текст собирается измениться и используется несколькими потоками, то лучше использовать
StringBuffer
. Если ваш текст собирается измениться, но используется одним потоком, используйтеStringBuilder
.источник
StringBuffer
StringBuffer является изменяемым, что означает, что можно изменить значение объекта. Объект, созданный через StringBuffer, хранится в куче. StringBuffer имеет те же методы, что и StringBuilder, но каждый метод в StringBuffer синхронизирован, то есть StringBuffer является потокобезопасным.
из-за этого он не позволяет двум потокам одновременно обращаться к одному и тому же методу. Каждый метод может быть доступен по одному потоку за раз.
Но безопасность потоков также имеет недостатки, так как производительность StringBuffer падает из-за свойства безопасности потоков. Таким образом, StringBuilder быстрее, чем StringBuffer, при вызове одних и тех же методов каждого класса.
Значение StringBuffer может быть изменено, это означает, что оно может быть присвоено новому значению. В настоящее время это наиболее распространенный вопрос интервью, различия между вышеуказанными классами. Строковый буфер может быть преобразован в строку с помощью метода toString ().
StringBuilder
StringBuilder такой же, как StringBuffer, то есть он хранит объект в куче, и его также можно изменить. Основное различие между StringBuffer и StringBuilder заключается в том, что StringBuilder также не является потокобезопасным. StringBuilder работает быстро, так как не является потокобезопасным.
Ресурс: String Vs StringBuffer Vs StringBuilder
источник
String
является неизменным.StringBuffer
является изменчивым и синхронизированным.StringBuilder
также изменчив, но не синхронизирован.источник
Javadoc объясняет разницу:
источник
StringBuilder
(введено в Java 5) идентичноStringBuffer
, за исключением того, что его методы не синхронизированы. Это означает, что он имеет лучшую производительность, чем последний, но недостатком является то, что он не является потокобезопасным.Прочитайте учебник для более подробной информации.
источник
Простая программа, иллюстрирующая разницу между StringBuffer и StringBuilder:
источник
StringBuffer используется для хранения строк символов, которые будут изменены (объекты String не могут быть изменены). Он автоматически расширяется по мере необходимости. Связанные классы: String, CharSequence.
StringBuilder был добавлен в Java 5. Он идентичен StringBuffer во всех отношениях, за исключением того, что он не синхронизирован, что означает, что если к нему одновременно обращаются несколько потоков, могут возникнуть проблемы. Для однопоточных программ, наиболее распространенный случай, избегая накладных расходов на синхронизацию, делает StringBuilder очень немного быстрее.
источник
StringBuilder
обычно они локальны для метода, где они видны только одному потоку.StringBuffer
синхронизируется, ноStringBuilder
нет. В результатеStringBuilder
быстрее чемStringBuffer
.источник
StringBuffer является изменяемым. Это может измениться с точки зрения длины и содержания. StringBuffers являются поточно-ориентированными, что означает, что у них есть синхронизированные методы для контроля доступа, так что только один поток может одновременно обращаться к синхронизированному коду объекта StringBuffer. Таким образом, объекты StringBuffer, как правило, безопасны для использования в многопоточной среде, где несколько потоков могут пытаться получить доступ к одному и тому же объекту StringBuffer одновременно.
StringBuilder Класс StringBuilder очень похож на StringBuffer, за исключением того, что его доступ не синхронизирован, поэтому он не является потокобезопасным. Без синхронизации производительность StringBuilder может быть лучше, чем StringBuffer. Таким образом, если вы работаете в однопоточной среде, использование StringBuilder вместо StringBuffer может привести к повышению производительности. Это также верно для других ситуаций, таких как локальная переменная StringBuilder (т. Е. Переменная в методе), где только один поток будет обращаться к объекту StringBuilder.
источник
StringBuffer:
StringBuilder
источник
String c = a + b
эквивалентноString c = new StringBuilder().append(a).append(b).toString()
, поэтому не быстрее. Это только то , что вы создаете новую для каждой строки передачи имущества, в то время как вы можете иметь только один (String d = a + b; d = d + c;
это вString d = new StringBuilder().append(a).append(b).toString(); d = new StringBuilder().append(d).append(c).toString();
то время какStringBuilder sb = new StringBuilder(); sb.append(a).append(b); sb.append(c); String d = sb.toString();
бы сохранить один StringBuilder при создании экземпляра).String-Builder :
Строка-буфер
По возможности рекомендуется использовать StringBuilder, потому что он работает быстрее, чем StringBuffer. Однако, если требуется безопасность потока, лучшим вариантом являются объекты StringBuffer.
источник
Лучшее использование,
StringBuilder
поскольку оно не синхронизировано и, следовательно, обеспечивает лучшую производительность.StringBuilder
является заменой старшегоStringBuffer
.источник
StringBu(ff|ild)er
это локальная переменная, используемая только одним потоком.Поскольку
StringBuffer
он синхронизирован, он требует дополнительных усилий, поэтому, исходя из производительности, он немного медленнее, чемStringBuilder
.источник
Между ними нет принципиальных различий,
StringBuilder
иStringBuffer
между ними существует только несколько различий. ВStringBuffer
методах синхронизированы. Это означает, что одновременно только один поток может работать с ними. Если существует более одного потока, то второй поток должен будет дождаться окончания первого, а третий должен ждать окончания первого и второго и так далее. Это делает процесс очень медленным и, следовательно, производительность в случаеStringBuffer
низкая.С другой стороны,
StringBuilder
не синхронизируется. Это означает, что одновременно несколько потоков могут работать с одним и тем жеStringBuilder
объектом одновременно. Это делает процесс очень быстрым и, следовательно, производительностьStringBuilder
высока.источник
A
String
является неизменным объектом, что означает, что значение не может быть изменено, тогда какStringBuffer
оно изменчиво.StringBuffer
Синхронизирован , следовательно , поточно-тоStringBuilder
нет и подходит только для однопоточных экземпляров.источник
Основное различие заключается
StringBuffer
в синхронизации, ноStringBuilder
это не так. Если вам нужно использовать более одного потока, рекомендуется StringBuffer. Но, согласно скорости выполнения,StringBuilder
она вышеStringBuffer
, потому что она не синхронизирована.источник
Проверьте внутренние компоненты синхронизированного метода добавления
StringBuffer
и несинхронизированного метода добавленияStringBuilder
.StringBuffer :
StringBuilder :
Так как append is
synchronized
,StringBuffer
имеет снижение производительности по сравнению сStrinbBuilder
многопоточным сценарием. Пока вы не разделяете буфер между несколькими потоками, используйте егоStringBuilder
, что быстро из-за отсутствияsynchronized
методов добавления.источник
Вот результат тестирования производительности для String vs StringBuffer vs StringBuilder . Наконец, StringBuilder выиграл тест. Ниже приведен тестовый код и результат.
Код :
Казни меня на идоне
Результат :
100000 итераций для добавления одного текста
10000 итераций для добавления одного текста
источник
источник
StringBuffer синхронизирован и потокобезопасен, StringBuilder не синхронизируется и работает быстрее.
источник