- Как очистить или очистить StringBuilder? [Дубликат]
- 9 ответов
- Как очистить или очистить StringBuilder? [дубликат]
- 9 ответов
- Java StringBuilder clear example, how to empty StringBuilder (StringBuffer)
- How to clear StringBuilder or StringBuffer in Java?
- 1) Clear StringBuilder by assigning a new object
- 2) Clear StringBuilder using the delete method
- 3) Clear StringBuilder using setLength method
- What is the best way to clear the StringBuilder?
- Классы StringBuffer и StringBuilder
- Методы класса StringBuffer
- length()
- capacity()
- ensureCapacity()
- setLength(int length)
- charAt(int index) и setCharAt(int index, char ch)
- getChars()
- append()
- insert()
- reverse()
- delete() и deleteCharAt()
- replace()
- substring()
- StringBuilder
- Как очистить или очистить StringBuilder?
- 9 ответов
Как очистить или очистить StringBuilder? [Дубликат]
Я использую StringBuilder в цикле, и каждые x итераций я хочу его очистить и начать с пустого StringBuilder , но я не вижу в документах каких-либо методов, похожих на .Net StringBuilder.Clear, только delete, который кажется слишком сложным.
Итак, каков наилучший способ очистки StringBuilder в Java?
9 ответов
Изменить Обновлено, чтобы добавить отзыв.
Так работают два способа:
- Используйте stringBuilderObj.setLength(0) .
- Выделите новый с помощью new StringBuilder() вместо очистки буфера
В основном есть две альтернативы, используя setLength(0) to reset StringBuilder или создавая новую на каждой итерации. Оба могут иметь плюсы и минусы в зависимости от использования.
Если вы заранее знаете ожидаемую пропускную способность StringBuilder, каждый раз создание нового должно быть таким же быстрым, как установка новой длины. Это также поможет сборщику мусора, поскольку каждый StringBuilder будет относительно недолговечным, и gc оптимизирован для этого.
Если вы не знаете емкость, повторное использование того же StringBuilder может быть быстрее. Каждый раз, когда вы превышаете емкость при добавлении, должен быть выделен новый массив поддержки, а предыдущий контент должен быть скопирован. Повторно используя тот же StringBuilder, он достигнет необходимой емкости после некоторых итераций и после этого не будет никакого копирования.
delete не слишком сложна:
Вы также можете сделать:
Если вы посмотрите на исходный код для StringBuilder или StringBuffer, вызов setLength() просто сбрасывает значение индекса для массива символов. ИМХО с использованием метода setLength всегда будет быстрее нового распределения. Они должны были бы назвать метод «clear» или «reset», чтобы он был более ясным.
Я проголосую за sb.setLength(0); не только потому, что это один вызов функции, но , потому что он фактически не копирует массив в другой массив, как sb.delete(0, builder.length()); , он просто заполняет оставшиеся символы 0 и установите для переменной длины новую длину.
Вы можете взглянуть на их реализацию, чтобы подтвердить мою точку от здесь в функции setLength и delete0 .
вы должны использовать sb.delete(0, sb.length()) или sb.setLength(0) и НЕ создать новый StringBuilder().
Я думаю, что многие из ответов здесь могут отсутствовать в качестве метода качества, включенного в StringBuilder : .delete(int start, [int] end) . Я знаю, что это поздний ответ; однако это должно быть сообщено (и объяснено немного более подробно).
Скажем, у вас есть таблица StringBuilder, которую вы хотите динамически изменять в своей программе (я сейчас работаю над этим), например.
Если вы перебираете метод и изменяете контент, используйте контент, а затем хотите отбросить содержимое для «очистки» StringBuilder для следующей итерации, вы можете удалить его содержимое, например.
начало и конец — индексы символов, которые вы хотите удалить. Не знаете длину в символах и хотите удалить все это?
СЕЙЧАС, для кикера. StringBuilders , как упоминалось ранее, накладывает много накладных расходов при частом изменении (и может вызвать проблемы с безопасностью в отношении потоков); поэтому используйте StringBuffer — то же, что и StringBuilder (за несколькими исключениями) — если ваш StringBuilder используется для взаимодействия с пользователем.
Источник
Как очистить или очистить StringBuilder? [дубликат]
этот вопрос уже есть ответ здесь:
Я использую StringBuilder в цикле и каждые X итераций я хочу очистить его и начать с пустого StringBuilder , но я не вижу никакого метода, подобного .NET StringBuilder.Ясно!—7—> в документации, просто удалить метод, который кажется чрезмерно сложным.
Итак, каков наилучший способ очистить StringBuilder в Java?
9 ответов
два способа работы:
- использовать stringBuilderObj.setLength(0) .
- выделить новый с new StringBuilder() вместо очистки буфера.
есть в основном два варианта, используя setLength(0) для сброса StringBuilder или создания нового на каждой итерации. Оба имеют свои плюсы и минусы в зависимости от использования.
Если вы заранее знаете ожидаемую емкость StringBuilder, создание нового каждый раз должно быть таким же быстрым, как установка новой длины. Это также поможет сборщику мусора, так как каждый StringBuilder будет относительно недолговечным, и gc оптимизирован для этого.
когда вы не знаете емкость, повторное использование того же StringBuilder может быть быстрее. При каждом превышении емкости при добавлении необходимо выделить новый резервный массив и скопировать предыдущее содержимое. Повторно используя тот же StringBuilder, он достигнет необходимой емкости после некоторых итераций, и после этого не будет никакого копирования.
delete — это не слишком сложно :
вы также можете сделать :
Если вы посмотрите на исходный код StringBuilder или StringBuffer, вызов setLength () просто сбрасывает значение индекса для массива символов. IMHO с использованием метода setLength всегда будет быстрее, чем новое распределение. Они должны были назвать метод «clear» или «reset», чтобы он был более ясным.
Я буду голосовать за sb.setLength(0); не только потому, что это один вызов функции, но потому что он фактически не копирует массив в другой массив как sb.delete(0, builder.length()); . Он просто заполняет оставшиеся символы равными 0 и устанавливает переменную длины в новую длину.
вы можете взглянуть на их реализацию, чтобы проверить мою точку зрения из здесь at setLength функции .
Это самый простой способ.
вы должны использовать sb.delete(0, sb.length()) или sb.setLength(0) и не создавать новый StringBuilder ().
Я думаю, что многие из ответов здесь могут отсутствовать метод качества, включенный в StringBuilder : .delete(int start, [int] end) . Я знаю, что это поздний ответ, однако, это должно быть известно (и объяснить немного более подробно).
предположим, у вас есть таблица StringBuilder , которую вы хотите динамически изменять в своей программе (над которой я сейчас работаю), например
если вы выполняете цикл через метод и изменяете содержимое, используйте содержимое, а затем желание отказаться от контента, чтобы «очистить» StringBuilder для следующей итерации, вы можете удалить его содержимое, например,
начало и конец являются индексами символов, которые вы хотите удалить. Не знаете длину в символах и хотите удалить все это?
теперь, для кикера. StringBuilders , как упоминалось ранее, возьмите много накладных расходов при частом изменении (и может вызвать проблемы безопасности в отношении резьбы); поэтому используйте StringBuffer — то же, что StringBuilder (за несколькими исключениями) — если ваш StringBuilder используется с целью взаимодействия с пользователем.
Если производительность является основной проблемой . ирония (IMO) — это конструкции Java для форматирования текста, который идет на буфер будет гораздо более трудоемким на CPU, чем сборщик alloc/realloc/мусора . ну, возможно, не GC в зависимости от того, сколько строителей вы создаете и отбрасываете.
но просто добавляя составную строку («Hello World of» + 6E9 + » earthlings.») к буферу, вероятно, сделает все дело непоследовательный.
и, действительно, если StringBuilder участвует, контент сложный и длинный и длиннее, чем простой String str = «Hi»; (неважно, что Java, вероятно, использует построитель в фоновом режиме).
лично я стараюсь не злоупотреблять GC. Поэтому, если это что — то, что будет много использоваться в сценарии быстрого огня, например, написание выходных сообщений отладки . Я просто предполагаю объявить его в другом месте и обнулить его для повторного использования.
Источник
Java StringBuilder clear example, how to empty StringBuilder (StringBuffer)
Java StringBuilder clear example shows how to clear the contents of StringBuilder or StringBuffer object. This example also shows how to empty StringBuilder/StringBuffer object in Java.
How to clear StringBuilder or StringBuffer in Java?
Suppose you have a StringBuilder object being used inside a loop and you want to empty its contents for each iteration of the loop. In such cases, you can clear the contents of the StringBuilder using below given ways.
1) Clear StringBuilder by assigning a new object
This method assigns a new StringBuilder object having no content to the existing reference. This is not exactly clearing the same object, but assigning a new empty object to the same reference.
2) Clear StringBuilder using the delete method
We can use the delete method of the StringBuilder class to selectively delete certain characters from it or we can use it to empty the contents of it.
The delete method accepts two parameters, start index and end index. To clear the contents, we are going to provide 0 as the start index and the length of the StringBuilder object as an end index to clear everything it has.
As you can see from the output, the content of the StringBuilder is cleared at the start of the loop.
3) Clear StringBuilder using setLength method
You can use the setLength method to clear the contents of the StringBuilder object.
For clearing the contents of the StringBuilder, we are going to pass 0 as new the length as shown in the below example.
What is the best way to clear the StringBuilder?
Now that we have seen three different methods to clear the StringBuilder, you may have this question. Well, the best way to clear the StringBuilder is to use the setLength method (3rd option).
Why? Because the first option creates a new StringBuilder object for each iteration of the loop. Object creation is a costly operation because it involves allocating new memory for the new object. Plus, garbage collection has to collect the old unused object. You should avoid this option if the number of iterations is too high due to the performance impact it might have.
Option 2 ( delete method) internally allocates a new buffer with the specified length and then copies the modified contents of the StringBuilder buffer to the new buffer. This is again a costly operation if the number of iteration is too high.
Option 3 is the best choice as it does not involve any new allocation and garbage collection. The setLength method just resets the internal buffer length variable to 0. The original buffer stays in the memory so new memory allocation is not needed and thus it is the fastest way to clear the StringBuilder.
Read this to know how to check if StringBuilder is empty or other String in Java to know more.
Источник
Классы StringBuffer и StringBuilder
Класс String представляет собой неизменяемые последовательности символов постоянной длины и частое использование объектов класса занимают много места в памяти. Класс StringBuffer представляет расширяемые и доступные для изменений последовательности символов, позволяя вставлять символы и подстроки в существующую строку и в любом месте. Данный класс гораздо экономичнее в плане потребления памяти и настоятельно рекомендуется к использованию.
Существует четыре конструктора класса:
- StringBuffer() — резервирует место под 16 символов без перераспределения памяти
- StringBuffer(int capacity) — явно устанавливает размер буфера
- StringBuffer(String string) — устанавливает начальное содержимое и резервирует 16 символов без повторого резервирования
- StringBuffer(CharSequence cs) — создаёт объект, содержащий последовательность символов и резервирует место ещё под 16 символов
Методы класса StringBuffer
length()
Метод позволяет получить текущую длину объекта.
capacity()
Метод позволяет получить текущий объём выделенной памяти.
Обратите внимание, что хотя слово состоит из четырёх символов, в памяти выделено запасное пространство для дополнительных 16 символов. Для такой простейшей операции выигрыша нет, но в сложных примерах, когда приходится на лету соединять множество строк, производительность резко возрастает.
ensureCapacity()
Можно предварительно выделить место для определённого количества символов, если собираетесь добавлять большое количество маленьких строк.
setLength(int length)
Устанавливает длину строки. Значение должно быть неотрицательным.
charAt(int index) и setCharAt(int index, char ch)
Можно извлечь значение отдельного символа с помощью метода charAt() и установить новое значение символа с помощью метода setCharAt(), указав индекс символа и его значение.
getChars()
Позволяет скопировать подстроку из объекта класса StringBuffer в массив. Необходимо позаботиться, чтобы массив был достаточного размера для приёма нужного количества символов указанной подстроки.
append()
Метод соединяет представление любого другого типа данных. Есть несколько перегруженных версий.
Строковое представление каждого параметра за кулисами получают через метод String.valueOf() и затем полученные строки склеиваются в итоговую строку.
insert()
Вставляет одну строку в другую. Также можно вставлять значения других типов, которые будут автоматически преобразованы в строки. Вам надо указать индекс позиции, куда будет вставляться строка.
reverse()
Позволяет изменить порядок символов на обратный.
У меня получилось практически то же самое, может метод глючит?
delete() и deleteCharAt()
Метод delete() удаляет последовательность символов, вам надо задать индекс первого символа, который надо удалить, а также индекс символа, следующего за последним из удаляемых. Метод deleteCharAt() удаляет один символ из указанной позиции.
replace()
Позволяет заменить один набор символов на другой. Нужно указать начальный и конечный индекс и строку замены.
substring()
Позволяет получить часть содержимого. Есть две формы метода. В первом случае нужно указать индекс начала позиции, с которой нужно получить подстроку. Во втором варианте указывается начальный индекс и конечный индекс, если нужно получить текст из середины строки.
Есть и другие методы
StringBuilder
Класс StringBuilder идентичен классу StringBuffer и обладает большей производительностью. Однако он не синхронизирован, поэтому его не нужно использовать в тех случаях, когда к изменяемой строке обращаются несколько потоков.
Создадим новый объект.
Добавляем новый фрагмент в существующую строку:
Соединять строки можно цепочкой.
Данный код работает чуть быстрее, чем вызов append() по отдельности. Но это будет заметно при очень больших объёмах.
Источник
Как очистить или очистить StringBuilder?
Я использую StringBuilder в цикле и каждые x итераций я хочу очистить его и начать с пустого StringBuilder , но я не вижу никакого метода, похожего на.NET StringBuilder.Clear в документации, только метод удаления, который кажется слишком сложным.
Итак, что является лучшим способом вычистить StringBuilder на яве?
9 ответов
Два способа, которые работают:
- использование stringBuilderObj.setLength(0) ,
- Выделите новый с new StringBuilder() вместо очистки буфера.
Есть в основном две альтернативы, использующие setLength(0) сбросить StringBuilder или создать новый в каждой итерации. Оба могут иметь плюсы и минусы в зависимости от использования.
Если вы заранее знаете ожидаемую емкость StringBuilder, каждый раз создавать новую следует так же быстро, как и устанавливать новую длину. Это также поможет сборщику мусора, так как каждый StringBuilder будет относительно недолгим, и gc оптимизирован для этого.
Если вы не знаете емкость, повторное использование одного и того же StringBuilder может быть быстрее. Каждый раз, когда вы превышаете емкость при добавлении, новый резервный массив должен быть выделен, и предыдущий контент должен быть скопирован. Повторно используя тот же StringBuilder, он достигнет необходимой емкости после нескольких итераций, и после этого не будет никакого копирования.
delete не слишком сложный:
Вы также можете сделать:
Если вы посмотрите на исходный код для StringBuilder или StringBuffer, то вызов setLength() просто сбрасывает значение индекса для массива символов. ИМХО использование метода setLength всегда будет быстрее, чем новое выделение. Они должны были назвать метод «clear» или «reset», чтобы он был понятнее.
Я буду голосовать за sb.setLength(0); не только потому, что это один вызов функции, но и потому, что он на самом деле не копирует массив в другой массив, как sb.delete(0, builder.length()); , Он просто заполняет оставшиеся символы равными 0 и устанавливает переменную длины в новую длину.
Вы можете взглянуть на их реализацию, чтобы подтвердить мою точку зрения здесь, на setLength функция и delete0 функция.
Вы должны использовать sb.delete(0, sb.length()) или же sb.setLength(0) и НЕ создавать новый StringBuilder().
Я думаю, что во многих ответах здесь может отсутствовать качественный метод, включенный в StringBuilder : .delete(int start, [int] end) , Я знаю, что это поздний ответ; однако, это должно быть сделано известным (и объяснено немного более подробно).
Допустим, у вас есть таблица StringBuilder — которую вы хотите динамически изменять во всей вашей программе (одна из них, над которой я сейчас работаю, делает это), например
Если вы перебираете метод и изменяете контент, используйте его, а затем откажитесь от контента, чтобы «очистить» StringBuilder для следующей итерации вы можете удалить ее содержимое, например
начало и конец, являющиеся индексами символов, которые вы хотите удалить. Не знаете длину в символах и хотите удалить все это?
СЕЙЧАС для кикера. StringBuilders как упоминалось ранее, при частых изменениях требуется много накладных расходов (и это может вызвать проблемы с безопасностью в отношении многопоточности); поэтому используйте StringBuffer — такой же как StringBuilder (с несколькими исключениями) — если ваш StringBuilder используется с целью взаимодействия с пользователем.
Если производительность является основной проблемой. ирония (IMO) заключается в том, что Java-конструкции для форматирования текста, поступающего в буфер, будут занимать гораздо больше времени на ЦП, чем ассигнование alloc / realloc / garbage. ну, возможно, не GC в зависимости от того, сколько строителей вы создаете и выбрасываете.
Но простое добавление составной строки («Hello World of » + 6E9 + » earthlings.») К буферу может сделать весь вопрос несущественным.
И действительно, если задействован StringBuilder, контент будет сложным, длинным и длиннее простого String str = «Hi»; (не говоря уже о том, что Java, вероятно, использует конструктор в фоновом режиме).
Лично я стараюсь не злоупотреблять ГК. Так что, если это что-то, что будет часто использоваться в сценарии быстрого запуска — например, при написании отладочных выходных сообщений. Я просто предполагаю объявить это в другом месте и обнулить его для повторного использования.
Источник