Очистка строкового буфера/построителя после цикла

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

Ответ 1

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

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:

Ответ 2

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

public void setLength(int newLength)

У вас может быть такой случай, как

StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb

Ответ 3

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

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

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 в цикле, иначе он будет создавать новые объекты с каждой итерацией. Для создания объектов требуются системные ресурсы, пространство, а также требуется время. Поэтому в течение длительного времени избегайте объявления их внутри цикла, если это возможно.

Ответ 4

buf.delete(0,  buf.length());

Ответ 5

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

Ответ 6

Уже хороший ответ. Просто добавьте результат теста для разностей производительности 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

Ответ 7

StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();

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