Очистка строкового буфера / компоновщика после цикла - PullRequest
110 голосов
/ 11 февраля 2010

Как очистить строковый буфер в Java после цикла, чтобы на следующей итерации использовался очистить строковый буфер?

Ответы [ 8 ]

126 голосов
/ 11 февраля 2010

Один из вариантов - использовать метод удаления следующим образом:

StringBuffer sb = new StringBuffer();
for (int n = 0; n < 10; n++) {
   sb.append("a");

   // This will clear the buffer
   sb.delete(0, sb.length());
}

Другая опция (средство очистки битов) использует setLength (int len) :

sb.setLength(0);

См. Javadoc для получения дополнительной информации:

44 голосов
/ 22 ноября 2011

Самый простой способ повторно использовать StringBuffer - это использовать метод setLength()

public void setLength(int newLength)

Вы можете иметь дело как

StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
18 голосов
/ 19 июня 2015

У вас есть два варианта:

Либо использовать:

sb.setLength(0);  // It will just discard the previous data, which will be garbage collected later.  

Или используйте:

sb.delete(0, sb.length());  // A bit slower as it is used to delete sub sequence.  

Примечание

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

5 голосов
/ 11 февраля 2010

Я предлагаю создать новый StringBuffer (или даже лучше StringBuilder) для каждой итерации Разница в производительности действительно незначительна, но ваш код будет короче и проще.

5 голосов
/ 11 февраля 2010
buf.delete(0,  buf.length());
4 голосов
/ 17 января 2018
public void clear(StringBuilder s) {
    s.setLength(0);
}

Использование:

StringBuilder v = new StringBuilder();
clear(v);

для удобства чтения, я думаю, что это лучшее решение.

1 голос
/ 08 июля 2016

Уже хороший ответ там. Просто добавьте результат для теста производительности StringBuffer и StringBuild, используйте новый экземпляр в цикле или используйте setLength (0) в цикле.

Резюме: в большой петле

  • StringBuilder намного быстрее, чем StringBuffer
  • Создание нового экземпляра StringBuilder в цикле не имеет разница с setLength (0). (setLength (0) имеет очень очень маленькое преимущество перед созданием нового экземпляра.)
  • StringBuffer медленнее, чем StringBuilder, благодаря созданию нового экземпляра в цикле
  • setLength (0) из StringBuffer чрезвычайно медленнее, чем создание нового экземпляра в цикле.

Очень простой тест (я просто вручную изменил код и провёл другой тест):

public class StringBuilderSpeed {
public static final char ch[] = new char[]{'a','b','c','d','e','f','g','h','i'};

public static void main(String a[]){
    int loopTime = 99999999;
    long startTime = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    for(int i = 0 ; i < loopTime; i++){
        for(char c : ch){
            sb.append(c);
        }
        sb.setLength(0);
    }
    long endTime = System.currentTimeMillis();
    System.out.println("Time cost: " + (endTime - startTime));
}

}

Новый экземпляр StringBuilder в цикле: Стоимость времени: 3693, 3862, 3624, 3742

StringBuilder setLength: Стоимость времени: 3465, 3421, 3557, 3408

Новый экземпляр StringBuffer в цикле: Стоимость времени: 8327, 8324, 8284

StringBuffer setLength Стоимость времени: 22878, 23017, 22894

Снова StringBuilder setLength, чтобы убедиться, что у моего labtop нет проблем с таким длинным использованием StringBuffer setLength :-) Стоимость времени: 3448

0 голосов
/ 17 марта 2015
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();

Я думаю, что этот код быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...