Какова емкость StringBuffer? И каково его назначение и его влияние?

Какова емкость StringBuffer? Нужно ли устанавливать размер емкости при запуске программы? И если она не задана, является ли она причиной медленной работы программы? например. использование символов длиной более 1000 StringBuffer outputSource = new StringBuffer();С другой стороны, установка относительно точного значения должна будет увеличить производительность программных вычислений? Я надеюсь, что мой вопрос ясен. Спасибо заранее!

6 ответов

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

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

Обратите внимание, что если вы не используете несколько операций для создания длинных строк, это не повлияет на производительность. Ситуация, когда определение емкости может быть полезным, например, создает строку из 10000 символов, по 10 символов, добавляемых за раз. Это займет 1000 добавочных вызовов и может потребовать внутреннего char[] изменить размер несколько раз.

Однако, если бы вы создали строку из 10000 символов с двумя добавлениями, вы можете получить только 2 изменения размера. Это вряд ли проблема с точки зрения производительности.

Согласно JavaDoc

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

Некоторые важные выносы

Если вы переполните емкость буфера, необходимого для выделения большего объема памяти, это будет иметь некоторое влияние на производительность в зависимости от того, как StringBuffer используется.

В основном емкость StringBuffer столько памяти, сколько вы отдали своей программе.

Если вы не используете многопоточность StringBuilder

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

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

Если у StringBuilder не хватает места, он удваивает свой буфер (в этом случае необходимо скопировать всю строку). причина, по которой буфер удваивается, а не просто расширяется до размера, соответствующего размеру старой строки + добавленной, заключается в том, что в этом случае строку всегда придется копировать снова. следовательно это удваивается.

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

Надеюсь это поможет

StringBuffer Поток безопасен. поэтому он работает медленнее, когда у него большой объем данных. вместо вашего приложения однопоточное использование StringBuilder, это быстрый доступ по сравнению с StringBuffer, но StringBuilder не является потокобезопасным.

Вы должны предпочесть использовать StringBuffer учебный класс.

Класс StringBuffer является изменяемым классом в отличие от класса String, который является неизменным. И емкость, и символьная строка класса StringBuffer. StringBuffer может быть изменен динамически. Строковые буферы предпочтительны, когда речь идет о тяжелой модификации символьных строк (добавление, вставка, удаление, изменение и т. Д.).

Есть такие функции, как capacity() а также ensureCapacity() в классе StringBuffere.

capacity() : Returns the current capacity of the String buffer.

ensureCapacity() : this method ensures minimum capacity of the String buffer.

Вы можете перейти по следующим ссылкам, чтобы узнать кратко о StringBuffer:

http://www.studytonight.com/java/stringbuffer-class.php

http://www.javabeginner.com/learn-java/java-stringbuffer

Любой как stringbuffer изменчив. любой, как он не собирается создавать какой-либо дальнейший объект, как только он был выделен в память.

так что это не влияет на производительность, если вы определите какой-либо размер strignbuffer

Другие вопросы по тегам