คุณจะล้างบัฟเฟอร์สตริงใน 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
StringBuffer setLength Time cost: 22878, 23017, 22894
อีกครั้ง StringBuilder setLength เพื่อให้แน่ใจว่าห้องปฏิบัติการของฉันไม่ได้มีปัญหาในการใช้ความยาวเช่นนี้สำหรับ StringBuffer setLength :-) ค่าเวลา: 3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
ฉันคิดว่ารหัสนี้เร็วกว่า