Як очистити буфер рядків у Java після циклу, щоб наступна ітерація використовувала чіткий буфер струна?
Як очистити буфер рядків у Java після циклу, щоб наступна ітерація використовувала чіткий буфер струна?
Відповіді:
Одним із варіантів є використання методу видалення наступним чином:
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 для отримання додаткової інформації:
Найпростіший спосіб повторного використання - StringBuffer
це використовувати методsetLength()
public void setLength(int newLength)
Ви можете мати такий випадок
StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
setLength
замість setlength
.
У вас є два варіанти:
Будь-яке використання:
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
об'єктів у циклі, інакше це створюватиме нові об'єкти з кожною ітерацією. Для створення об'єктів потрібні системні ресурси, простір, а також потрібен час. Тому на тривалий час уникайте оголошення їх, якщо це можливо, в циклі.
buf.delete(0, buf.length());
Я пропоную створити нову StringBuffer
(або ще краще StringBuilder
) для кожної ітерації. Різниця в продуктивності дійсно незначна, але ваш код буде коротшим і простішим.
public void clear(StringBuilder s) {
s.setLength(0);
}
Використання:
StringBuilder v = new StringBuilder();
clear(v);
щодо читабельності, я думаю, що це найкраще рішення.
Вже гарна відповідь там. Просто додайте результат порівняння для різниці в продуктивності StringBuffer і StringBuild, використовуйте новий екземпляр у циклі або використовуйте setLength (0) у циклі.
Підсумок: У великій петлі
Дуже простий орієнтир (я просто вручну змінив код і зробив різні тести):
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
Вартість StringBufferLength Часова вартість: 22878, 23017, 22894
Знову StringBuilder setLength, щоб не мій лабораторій отримав якусь проблему, щоб використовувати такий довгий для StringBuffer setLength :-) Вартість часу: 3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
Я думаю, що цей код швидше.