Как очистить stringbuilder java
Здравствуйте, Аноним, Вы писали:
А>Какой метод используете чтобы переиспользовать StringBuilder? Что-то вроде reset.
Зачем?
Re[2]: Как очистить StringBuilder?
| От: | Аноним |
| Дата: | 25.01.10 09:53 |
| Оценка: |
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Какой метод используете чтобы переиспользовать StringBuilder? Что-то вроде reset.
B>Зачем?
Чтобы переиспользовать: когда буфер большой и используется интенсивно — это эффективно.
Re[3]: Как очистить StringBuilder?
| От: | Blazkowicz |
| Дата: | 25.01.10 10:00 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Чтобы переиспользовать: когда буфер большой и используется интенсивно — это эффективно.
Существование Eden space даёт мне серьезный повод сомневаться в этом.
Re: Как очистить StringBuilder?
| От: | LeonidV | http://vygovskiy.com |
| Дата: | 25.01.10 10:28 | |
| Оценка: |
sb = new StringBuffer()
И не задумывайтесь о производительности в таких мелочах, пока профайлер не покажет — надо задумываться.
http://jvmmemory.com — простой способ настройки JVM
Re: Как очистить StringBuilder?
| От: | C0s |
| Дата: | 25.01.10 10:59 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Какой метод используете чтобы переиспользовать StringBuilder? Что-то вроде reset.
если очень хочется, то setLength(0)
но, как уже заметили другие, зачем?
Re[3]: Как очистить StringBuilder?
| От: | C0s |
| Дата: | 25.01.10 11:02 |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Чтобы переиспользовать: когда буфер большой и используется интенсивно — это эффективно.
некоторые задачи «большой и интенсивной» символьной обработки следует решать с помощью java.nio.CharBuffer
часом, не тот случай?
Re: Как очистить StringBuilder?
| От: | Географ | нет |
| Дата: | 25.01.10 12:45 | |
| Оценка: |
Здравствуйте, Аноним, Вы писали:
А>Какой метод используете чтобы переиспользовать StringBuilder? Что-то вроде reset.
Я лично использую delete(0, Integer.MAX_VALUE). Это опустошает буфер, начиная с первого индекса, и сохраняя зарезервированную перед этим память для будущего переиспользования. Это лучше, чем вызов setLength(0) тем, что setLength устанавливает вместо старого новый буферок длиной 16 символов, как это принято в конструкторе по умолчанию. Проверено на версии 1.4. Если основная работа идёт со строками, то утакой методой уменьшается нагрузка на менеджер памяти, полагаю. Впрочем, ещё больше зависит от постановки задачи, как и всегда.
Re[2]: Как очистить StringBuilder?
| От: | C0s | |
| Дата: | 25.01.10 13:23 | |
| Оценка: | 2 (1) +1 | |
Здравствуйте, Географ, Вы писали:
Г>Это лучше, чем вызов setLength(0) тем, что setLength устанавливает вместо старого новый буферок длиной 16 символов, как это принято в конструкторе по умолчанию. Проверено на версии 1.4.
так было и осталось в 1.4, которая уже практически сама знаете где
начиная с 1.5 setLength массив оставляет как есть — смотрю по исходникам sun
Re[3]: Как очистить StringBuilder?
| От: | Географ | нет |
| Дата: | 25.01.10 15:18 | |
| Оценка: |
Здравствуйте, C0s, Вы писали:
C0s>Здравствуйте, Географ, Вы писали:
Г>>Это лучше, чем вызов setLength(0) тем, что setLength устанавливает вместо старого новый буферок длиной 16 символов, как это принято в конструкторе по умолчанию. Проверено на версии 1.4.
C0s>так было и осталось в 1.4, которая уже практически сама знаете где
C0s>начиная с 1.5 setLength массив оставляет как есть — смотрю по исходникам sun
Значит, так и есть. Но 1.4 применяется во многих реальных проектах, втом числе и в госконторах с очень большими размерами кода и данных. Например, РЖД, ФМС, МВД — это только то, где я лично участвую сегодня.
И что setLength(. ), что delete(. ) делают одно и тоже . Короче, дело вкуса. И версии Java .
Re[4]: Как очистить StringBuilder?
| От: | C0s |
| Дата: | 25.01.10 15:32 |
| Оценка: |
Здравствуйте, Географ, Вы писали:
Г>Значит, так и есть. Но 1.4 применяется во многих реальных проектах, втом числе и в госконторах с очень большими размерами кода и данных. Например, РЖД, ФМС, МВД — это только то, где я лично участвую сегодня.
о, повод спросить не по теме топика
а в этих конторах покупают поддержку sun и используют солярис?
и если нет, то является ли это поводом думать при очередной коллизии поездов из-за какой-нибудь не сработавшей стрелки или семафора, что это из-за использования устаревшей платформы?
Re[3]: Как очистить StringBuilder?
| От: | Blazkowicz |
| Дата: | 25.01.10 16:17 |
| Оценка: |
Здравствуйте, C0s, Вы писали:
C0s>смотрю по исходникам sun
Мне кажется что другие вендоры никак не модифицируют основной код java.* API. Вся разница касается в основном реалиазации внутренних механизмов JVM.
Re[5]: Как очистить StringBuilder?
| От: | toxin |
| Дата: | 26.01.10 07:05 |
| Оценка: |
Здравствуйте, C0s, Вы писали:
C0s>о, повод спросить не по теме топика
C0s>а в этих конторах покупают поддержку sun и используют солярис?
C0s>и если нет, то является ли это поводом думать при очередной коллизии поездов из-за какой-нибудь не сработавшей стрелки или семафора, что это из-за использования устаревшей платформы?
А что есть маниаки которые яву в софт для оперативного диспетчерского управления пихают?
Сдается мне ява там используется для всякого рода ИС не имеющих прямого отношения к управлению стрелками и семафорами, и они там могут хоть 1.1 использовать в силу жесткого консерватизма местных админов и кучки софта, которая временами на 1.5 даже не запускается
Как я могу очистить или очистить StringBuilder?
Я использую StringBuilder в цикле и каждый раз в два раза хочу очистить его и начать с пустого StringBuilder , но я не вижу никакого метода, похожего на метод StringBuilder.Clear в документации к.NET, только метод delete, который кажется слишком сложным. Так что есть лучший способ очистить StringBuilder в Java? java stringbuilder
Поделиться Источник 04 марта 2011 в 10:26
9 ответов
- Используйте stringBuilderObj.setLength(0) .
- Выделите новый с помощью new StringBuilder() вместо очистки буфера. Обратите внимание, что для критически важных для производительности путей кода этот подход может быть значительно медленнее, чем подход на основе setLength (поскольку новый объект с новым буфером должен быть выделен, старый объект становится подходящим для GC и т.д.).
Поделиться 04 марта 2011 в 10:29
Существует два альтернативных варианта, использующих setLength(0) для сброса StringBuilder или создания нового в каждой итерации. Оба могут иметь преимущества и недостатки в зависимости от использования.
Если вы знаете ожидаемую мощность StringBuilder заранее, создание нового каждый раз должно быть таким же быстрым, как установка новой длины. Это также поможет сборщику мусора, так как каждый StringBuilder будет относительно коротким, и gc оптимизирован для этого.
Когда вы не знаете мощность, повторное использование того же StringBuilder может быть быстрее. Каждый раз, когда вы превышаете мощность при добавлении, должен быть выделен новый обратный массив, а предыдущее содержимое должно быть скопировано. Повторное использование того же самого StringBuilder достигнет необходимой мощности после некоторых итераций, и после этого не будет никаких копирований.
Поделиться 04 марта 2011 в 11:26
delete не слишком сложен:
myStringBuilder.delete(0, myStringBuilder.length());
Вы также можете сделать:
myStringBuilder.setLength(0);
Поделиться 04 марта 2011 в 10:30
Если вы посмотрите на исходный код для StringBuilder или StringBuffer, вызов setLength() просто сбрасывает значение индекса для символьного массива. Имам, использование метода setLength всегда будет быстрее нового выделения. Они должны были назвать метод ‘clear’ или’reset’, чтобы было понятнее.
Поделиться 20 сентября 2011 в 16:42
Я проголосую за sb.setLength(0); не только потому, что это один вызов функции, но потому, что он фактически не копирует массив в другой массив , как sb.delete(0, builder.length()); . Он просто заполняет оставшиеся символы равным 0 и устанавливает переменную длины на новую длину.
Вы можете взглянуть на их реализацию, чтобы проверить мою точку зрения здесь в функции setLength и delete0 .
Поделиться 12 мая 2015 в 12:08
Вы должны использовать sb.delete(0, sb.length()) или sb.setLength(0) и НЕ создавать новый StringBuilder().
Смотрите этот связанный пост для производительности: Лучше ли использовать StringBuilder в цикле?
Поделиться 15 ноября 2012 в 22:57
Я думаю, что многие из ответов здесь могут не хватать качественного метода, включенного в StringBuilder : .delete(int start, [int] end) . Я знаю, что это поздний ответ; однако это должно быть известно (и объяснено немного подробнее).
Допустим, у вас есть таблица StringBuilder — которую вы хотите изменить динамически во всей вашей программе (один из них, над которым я работаю сейчас, делает это), например,
StringBuilder table = new StringBuilder();
Если вы прокручиваете цикл по методу и изменяете содержимое, используйте содержимое, затем хотите удалить содержимое, чтобы «очистить» StringBuilder для следующей итерации, вы можете удалить его содержимое, например,
table.delete(int start, int end).
начало и конец — это индексы символов, которые вы хотите удалить. Не знаете длины символов и хотите удалить все?
table.delete(0, table.length());
Теперь, для кикера. StringBuilders , как упоминалось ранее, часто выполняет много накладных расходов (и может вызвать проблемы безопасности в отношении потоков); поэтому используйте StringBuffer — то же самое, что и StringBuilder (за несколькими исключениями), если ваш StringBuilder используется для взаимодействия с пользователем.
Поделиться 27 марта 2014 в 17:25
StringBuilder s = new StringBuilder(); s.append("a"); s.append("a"); // System.out.print(s); is return "aa" s.delete(0, s.length()); System.out.print(s.length()); // is return 0
это простой способ.
Поделиться 02 августа 2013 в 21:44
Если производительность является основной проблемой, то ирония, на мой взгляд, заключается в том, что конструкции Java для форматирования текста, который переходит в буфер, будут потреблять гораздо больше времени на ЦП, чем коллекция allocation/reallocation/garbage. ну, возможно, не GC (коллекция мусора) в зависимости от того, сколько сборщиков вы создаете и отбрасываете.
Но простое добавление строки со сложным составом ( «Привет мир » + 6E9 + » земляне.» ) в буфер, вероятно, сделает все это нерелевантным.
И, действительно, если задействован экземпляр StringBuilder , то содержимое сложное и/или длиннее простой String str = «Привет»; (неважно, что Java, вероятно, использует сборщик в фоновом режиме в любом случае).
Лично я пытаюсь не злоупотреблять GC. Так что, если это что-то, что будет часто использоваться в быстром сценарии — например, написание отладочных сообщений — я просто предполагаю объявить это в другом месте и исключить его для повторного использования.
class MyLogger < StringBuilder strBldr = new StringBuilder(256); public void logMsg( String stuff, SomeLogWriterClass log ) < // zero out strBldr's internal index count, not every // index in strBldr's internal buffer strBldr.setLength(0); // . append status level strBldr.append("Info"); // . append ' ' followed by timestamp // assuming getTimestamp() returns a String strBldr.append(' ').append(getTimestamp()); // . append ':' followed by user message strBldr.append(':').append(msg); log.write(strBldr.toString()); >>
Удаление подстроки из StringBuilder в Java
Чтобы удалить подстроку из объекта Java StringBuilder, мы используем метод delete(). Метод delete() удаляет символы в диапазоне из последовательности. Имеет два параметра, начало и конец. Символы удаляются из индекса начала до конца.
Объявление – метод java.lang.StringBuilder.delete() объявляется следующим образом:
public StringBuilder delete(int start,int end)
Давайте посмотрим пример, который удаляет подстроку из StringBuilder.
Пример
public class Example < public static void main(String[] args) < StringBuilder sb = new StringBuilder("Welcome to Java Programming"); System.out.println("Original StringBuilder Object: " + sb.toString()); sb.delete(4,10); System.out.println("New StringBuilder Object: " + sb.toString()); >>
Вывод
Original StringBuffer Object: Welcome to Java Programming New StringBuffer Object: Welc Java Programming
Средняя оценка 3 / 5. Количество голосов: 3
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
Помогите улучшить статью.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
Очистка объекта StringBuilder в Java
Часто встречается ситуация, когда в процессе работы с объектом StringBuilder в Java возникает необходимость его очистить. Например, если используется цикл, в котором StringBuilder наполняется данными, и после каждого n-го повторения цикла требуется начать с пустого StringBuilder .
В Java нет прямого аналога метода Clear , который имеется в .NET для очистки StringBuilder . Вместо этого в Java есть метод delete() , который позволяет удалить подстроку из строки, хранящейся в StringBuilder . Однако использование этого метода может казаться сложным и избыточным, если нужно просто полностью очистить StringBuilder .
Наиболее простым и эффективным способом очистки StringBuilder в Java является присвоение ему нового экземпляра StringBuilder . Это можно сделать следующим образом:
StringBuilder sb = new StringBuilder(); sb.append("Hello, World!"); // Теперь sb содержит "Hello, World!" sb = new StringBuilder(); // Теперь sb пуст
Такой подход работает, потому что в Java объекты являются ссылочными типами. Когда sb присваивается новый экземпляр StringBuilder , старый экземпляр, содержащий «Hello, World!», больше не доступен и будет утилизирован сборщиком мусора.
Важно отметить, что этот подход является предпочтительным не только из-за его простоты, но и потому что он обычно будет быстрее, чем использование метода delete() . Это объясняется тем, что delete() требует времени на обновление внутреннего состояния StringBuilder , в то время как присвоение нового экземпляра StringBuilder является простой операцией.