ループ後にJavaの文字列バッファーをクリアして、次の反復でクリア文字列バッファーを使用するにはどうすればよいですか?
1つのオプションは、次のように削除メソッドを使用することです。
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
次の2つのオプションがあります。
次のいずれかを使用します。
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
オブジェクトを宣言しないでください。そうしないと、反復ごとに新しいオブジェクトが作成されます。オブジェクトの作成には、システムリソースとスペースが必要であり、時間がかかります。したがって、長期的には、可能であればループ内で宣言しないでください。
繰り返しごとに新しいStringBuffer
(またはもっと良いのは StringBuilder
)を作成することをお勧めします。パフォーマンスの違いは実際にはごくわずかですが、コードはより短く簡単になります。
buf.delete(0, buf.length());
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、3702
StringBuilder setLength:時間コスト:3465、3421、3557、3408
ループ内の新しいStringBufferインスタンス:時間コスト:8327、8324、8284
StringBuffer setLength時間コスト:22878、23017、22894
繰り返しますが、StringBuilder setLengthを使用すると、ラボトップでStringBuffer setLengthにそのようなlongを使用する際に問題が発生しないようになります:-)時間コスト:3448
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();
このコードはもっと速いと思います。