Làm cách nào để xóa bộ đệm chuỗi trong Java sau một vòng lặp để lần lặp tiếp theo sử dụng bộ đệm chuỗi rõ ràng?
Làm cách nào để xóa bộ đệm chuỗi trong Java sau một vòng lặp để lần lặp tiếp theo sử dụng bộ đệm chuỗi rõ ràng?
Câu trả lời:
Một tùy chọn là sử dụng phương pháp xóa như sau:
StringBuffer sb = new StringBuffer();
for (int n = 0; n < 10; n++) {
sb.append("a");
// This will clear the buffer
sb.delete(0, sb.length());
}
Một tùy chọn khác (dọn dẹp bit) sử dụng setLength (int len) :
sb.setLength(0);
Xem Javadoc để biết thêm thông tin:
Cách dễ nhất để sử dụng lại StringBuffer
là sử dụng phương phápsetLength()
public void setLength(int newLength)
Bạn có thể gặp trường hợp như
StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
setLength
thay vì setlength
.
Bạn có hai lựa chọn:
Sử dụng:
sb.setLength(0); // It will just discard the previous data, which will be garbage collected later.
Hoặc dùng:
sb.delete(0, sb.length()); // A bit slower as it is used to delete sub sequence.
Tránh khai báo StringBuffer
hoặc StringBuilder
các đối tượng trong vòng lặp nếu không nó sẽ tạo các đối tượng mới với mỗi lần lặp. Việc tạo các đối tượng đòi hỏi tài nguyên hệ thống, không gian và cũng cần thời gian. Vì vậy, về lâu dài, hãy tránh khai báo chúng trong vòng lặp nếu có thể.
buf.delete(0, buf.length());
Tôi khuyên bạn nên tạo mới StringBuffer
(hoặc thậm chí tốt hơn StringBuilder
) cho mỗi lần lặp. Sự khác biệt về hiệu suất thực sự không đáng kể, nhưng mã của bạn sẽ ngắn hơn và đơn giản hơn.
public void clear(StringBuilder s) {
s.setLength(0);
}
Sử dụng:
StringBuilder v = new StringBuilder();
clear(v);
để dễ đọc, tôi nghĩ đây là giải pháp tốt nhất.
Đã có câu trả lời tốt ở đó. Chỉ cần thêm kết quả điểm chuẩn cho sự khác biệt hiệu suất StringBuffer và StringBuild sử dụng phiên bản mới trong vòng lặp hoặc sử dụng setLength (0) trong vòng lặp.
Tóm tắt là: Trong một vòng lặp lớn
Điểm chuẩn rất đơn giản (tôi chỉ cần thay đổi mã theo cách thủ công và thực hiện kiểm tra khác):
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));
}
}
Phiên bản StringBuilder mới trong vòng lặp: Chi phí thời gian: 3693, 3862, 3624, 3742
StringBuilder setLength: Time Cost: 3465, 3421, 3557, 3408
Phiên bản StringBuffer mới trong vòng lặp: Chi phí thời gian: 8327, 8324, 8284
StringBuffer setLength Chi phí thời gian: 22878, 23017, 22894
Một lần nữa StringBuilder setLength để đảm bảo rằng labtop của tôi không gặp vấn đề gì khi sử dụng lâu như vậy cho StringBuffer setLength :-) Chi phí thời gian: 3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
tôi nghĩ mã này nhanh hơn.