Java: очищаемм содержимое StringBuilder/StringBuffer
Для сложения большого количества строк гораздо эффективнее использовать объект StringBuilder (в многопоточной среде StringBuffer ). Но иногда возникает необходимость в очистке содержиммого StringBuilder -а. К сожалению данный класс не имеет метода, который бы очищал его содержимое. Но выход из ситуации есть: можно воспользоваться методом delete(int start, int end) класса StringBuilder , который удаляет строчки начиная с позиции start до позиции end .
В качестве начальной позиции необходимо указать 0, в в качестве конечной позиции — длинну содержимого StringBuilder-а. Выглядеть это все будет приерно так:
sb.delete(0, sb.length());
public class Test public static void main (String[] args) StringBuffer sb = new StringBuffer(); sb.append("This is StringBuilder "); sb.append("example"); System.out.println("StringBuilder content before cleaning: \n" + sb.toString()); //removing StringBuilder content sb.delete(0, sb.length()); sb.append("This is new StringBuilder content"); System.out.println("\n" + sb.toString()); > >
StringBuilder content before cleaning: This is StringBuilder exampleThis is new StringBuilder content
Для StringBuffer-а принцип такой же.
Как очистить 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 даже не запускается
Классы StringBuffer и StringBuilder
Класс String представляет собой неизменяемые последовательности символов постоянной длины и частое использование объектов класса занимают много места в памяти. Класс StringBuffer представляет расширяемые и доступные для изменений последовательности символов, позволяя вставлять символы и подстроки в существующую строку и в любом месте. Данный класс гораздо экономичнее в плане потребления памяти и настоятельно рекомендуется к использованию.
Существует четыре конструктора класса:
- StringBuffer() — резервирует место под 16 символов без перераспределения памяти
- StringBuffer(int capacity) — явно устанавливает размер буфера
- StringBuffer(String string) — устанавливает начальное содержимое и резервирует 16 символов без повторого резервирования
- StringBuffer(CharSequence cs) — создаёт объект, содержащий последовательность символов и резервирует место ещё под 16 символов
Методы класса StringBuffer
length()
Метод позволяет получить текущую длину объекта.
StringBuffer sb = new StringBuffer("Котэ"); mInfoTextView.setText("Длина: " + sb.length());
capacity()
Метод позволяет получить текущий объём выделенной памяти.
StringBuffer sb = new StringBuffer("Котэ"); mInfoTextView.setText("Объём памяти: " + sb.capacity()); // вернёт 20
Обратите внимание, что хотя слово состоит из четырёх символов, в памяти выделено запасное пространство для дополнительных 16 символов. Для такой простейшей операции выигрыша нет, но в сложных примерах, когда приходится на лету соединять множество строк, производительность резко возрастает.
ensureCapacity()
Можно предварительно выделить место для определённого количества символов, если собираетесь добавлять большое количество маленьких строк.
setLength(int length)
Устанавливает длину строки. Значение должно быть неотрицательным.
charAt(int index) и setCharAt(int index, char ch)
Можно извлечь значение отдельного символа с помощью метода charAt() и установить новое значение символа с помощью метода setCharAt(), указав индекс символа и его значение.
StringBuffer sb = new StringBuffer("Кит"); sb.setCharAt(1, 'o'); mInfoTextView.setText(sb.toString());
getChars()
Позволяет скопировать подстроку из объекта класса StringBuffer в массив. Необходимо позаботиться, чтобы массив был достаточного размера для приёма нужного количества символов указанной подстроки.
append()
Метод соединяет представление любого другого типа данных. Есть несколько перегруженных версий.
StringBuffer append(String string) StringBuffer append(int number) StringBuffer append(Object object)
Строковое представление каждого параметра за кулисами получают через метод String.valueOf() и затем полученные строки склеиваются в итоговую строку.
String str1 = "У кота "; String str2 = " лапы"; int paws = 4; StringBuffer sb = new StringBuffer(20); sb.append(str1).append(paws).append(str2); mInfoTextView.setText(sb.toString());
insert()
Вставляет одну строку в другую. Также можно вставлять значения других типов, которые будут автоматически преобразованы в строки. Вам надо указать индекс позиции, куда будет вставляться строка.
StringBuffer sb = new StringBuffer("Я Котов"); sb.insert(2, "Люблю "); mInfoTextView.setText(sb.toString());
reverse()
Позволяет изменить порядок символов на обратный.
StringBuffer sb = new StringBuffer("МОКНЕТ ОКСАНА С КОТЕНКОМ"); sb.reverse(); mInfoTextView.setText(sb.toString());
У меня получилось практически то же самое, может метод глючит?
delete() и deleteCharAt()
Метод delete() удаляет последовательность символов, вам надо задать индекс первого символа, который надо удалить, а также индекс символа, следующего за последним из удаляемых. Метод deleteCharAt() удаляет один символ из указанной позиции.
replace()
Позволяет заменить один набор символов на другой. Нужно указать начальный и конечный индекс и строку замены.
substring()
Позволяет получить часть содержимого. Есть две формы метода. В первом случае нужно указать индекс начала позиции, с которой нужно получить подстроку. Во втором варианте указывается начальный индекс и конечный индекс, если нужно получить текст из середины строки.
Есть и другие методы
StringBuilder
Класс StringBuilder идентичен классу StringBuffer и обладает большей производительностью. Однако он не синхронизирован, поэтому его не нужно использовать в тех случаях, когда к изменяемой строке обращаются несколько потоков.
Создадим новый объект.
StringBuilder builder = new StringBuilder();
Добавляем новый фрагмент в существующую строку:
builder.append(ch); // можно добавить один символ builder.append(sometext); // а можно добавить готовую строку String completedString = builder.toString(); // результирующая строка
Соединять строки можно цепочкой.
new StringBuilder().append(s1).append(s2).append(s3).toString();
Данный код работает чуть быстрее, чем вызов append() по отдельности. Но это будет заметно при очень больших объёмах.
Очистка объекта 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 является простой операцией.