Как очистить строковый буфер в 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();
Я думаю, что этот код быстрее.