Bagaimana Anda menghapus buffer string di Java setelah loop sehingga iterasi berikutnya menggunakan buffer string yang jelas?
Bagaimana Anda menghapus buffer string di Java setelah loop sehingga iterasi berikutnya menggunakan buffer string yang jelas?
Jawaban:
Salah satu opsinya adalah menggunakan metode delete sebagai berikut:
StringBuffer sb = new StringBuffer();
for (int n = 0; n < 10; n++) {
sb.append("a");
// This will clear the buffer
sb.delete(0, sb.length());
}
Opsi lain (pembersih bit) menggunakan setLength (int len) :
sb.setLength(0);
Lihat Javadoc untuk info lebih lanjut:
Cara termudah untuk menggunakan kembali StringBuffer
adalah dengan menggunakan metode inisetLength()
public void setLength(int newLength)
Anda mungkin memiliki kasus seperti ini
StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
setLength
bukan setlength
.
Anda memiliki dua pilihan:
Salah satu penggunaan:
sb.setLength(0); // It will just discard the previous data, which will be garbage collected later.
Atau gunakan:
sb.delete(0, sb.length()); // A bit slower as it is used to delete sub sequence.
Hindari mendeklarasikan StringBuffer
atau StringBuilder
objek dalam loop lain itu akan membuat objek baru dengan setiap iterasi. Membuat objek membutuhkan sumber daya sistem, ruang dan juga membutuhkan waktu. Jadi untuk jangka panjang, hindari mendeklarasikannya dalam loop jika memungkinkan.
buf.delete(0, buf.length());
Saya sarankan membuat yang baru StringBuffer
(atau bahkan lebih baik, StringBuilder
) untuk setiap iterasi. Perbedaan kinerja benar-benar dapat diabaikan, tetapi kode Anda akan lebih pendek dan sederhana.
public void clear(StringBuilder s) {
s.setLength(0);
}
Pemakaian:
StringBuilder v = new StringBuilder();
clear(v);
untuk keterbacaan, saya rasa ini adalah solusi terbaik.
Jawaban udah bagus disana. Cukup tambahkan hasil benchmark untuk perbedaan kinerja StringBuffer dan StringBuild gunakan contoh baru dalam loop atau gunakan setLength (0) dalam loop.
Ringkasannya adalah: Dalam lingkaran besar
Tolok ukur yang sangat sederhana (Saya baru saja mengubah kode secara manual dan melakukan pengujian yang berbeda):
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));
}
}
Instance StringBuilder baru dalam loop: Biaya waktu: 3693, 3862, 3624, 3742
StringBuilder setLength: Biaya waktu: 3465, 3421, 3557, 3408
Instance StringBuffer baru dalam loop: Biaya waktu: 8327, 8324, 8284
StringBuffer setLength Waktu biaya: 22878, 23017, 22894
Sekali lagi StringBuilder setLength untuk memastikan labtop saya tidak mendapat masalah untuk digunakan selama itu untuk StringBuffer setLength :-) Biaya waktu: 3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
saya pikir kode ini lebih cepat.