Bir döngüden sonra Java'da dize arabelleğini nasıl temizlersiniz, böylece sonraki yineleme temiz bir dize arabelleği kullanır?
Bir döngüden sonra Java'da dize arabelleğini nasıl temizlersiniz, böylece sonraki yineleme temiz bir dize arabelleği kullanır?
Yanıtlar:
Bir seçenek, silme yöntemini aşağıdaki gibi kullanmaktır:
StringBuffer sb = new StringBuffer();
for (int n = 0; n < 10; n++) {
sb.append("a");
// This will clear the buffer
sb.delete(0, sb.length());
}
Başka bir seçenek (bit temizleyici) setLength (int len) kullanır :
sb.setLength(0);
Daha fazla bilgi için Javadoc'a bakın :
Yeniden kullanmanın en kolay yolu StringBuffer
yöntemi kullanmaktırsetLength()
public void setLength(int newLength)
Davaya sahip olabilirsin
StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
setLength
yerine okunması gerekir setlength
.
İki seçeneğiniz var:
Aşağıdakilerden birini kullanın:
sb.setLength(0); // It will just discard the previous data, which will be garbage collected later.
Veya kullan:
sb.delete(0, sb.length()); // A bit slower as it is used to delete sub sequence.
Döngü içindeki nesneleri StringBuffer
veya StringBuilder
nesneleri bildirmekten kaçının , aksi takdirde her yinelemede yeni nesneler oluşturur. Nesnelerin oluşturulması sistem kaynakları, alan gerektirir ve ayrıca zaman alır. Bu nedenle, uzun vadede, mümkünse bir döngü içinde bildirmekten kaçının.
buf.delete(0, buf.length());
Her yineleme için yeni StringBuffer
(veya daha iyisi StringBuilder
) oluşturmanızı öneririm . Performans farkı gerçekten önemsizdir, ancak kodunuz daha kısa ve daha basit olacaktır.
public void clear(StringBuilder s) {
s.setLength(0);
}
Kullanımı:
StringBuilder v = new StringBuilder();
clear(v);
Okunabilirlik için bunun en iyi çözüm olduğunu düşünüyorum.
Zaten iyi cevap var. StringBuffer için bir karşılaştırma sonucu ekleyin ve StringBuild performans farkı döngüde yeni örnek kullanın veya döngüde setLength (0) kullanın.
Özet: Büyük bir döngüde
Çok basit kıyaslama (sadece kodu manuel olarak değiştirdim ve farklı testler yaptım):
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));
}
}
Döngüdeki yeni StringBuilder örneği: Zaman maliyeti: 3693, 3862, 3624, 3742
StringBuilder setLength: Zaman maliyeti: 3465, 3421, 3557, 3408
Döngüde yeni StringBuffer örneği: Zaman maliyeti: 8327, 8324, 8284
StringBuffer setLength Zaman maliyeti: 22878, 23017, 22894
Yine StringBuilder setLength, laboratuarımın StringBuffer setLength :-) için bu kadar uzun süre kullanmak için bir sorunla karşılaşmamasını sağlamak için Zaman maliyeti: 3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
bence bu kod daha hızlı.