web-dev-qa-db-ja.com

ループ後の文字列バッファー/ビルダーのクリア

ループ後にJavaの文字列バッファーをクリアして、次の反復でクリア文字列バッファーを使用するにはどうすればよいですか?

111
waterfallrain

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 を参照してください。

129
Jon

StringBufferを再利用する最も簡単な方法は、メソッドsetLength()を使用することです

public void setLength(int newLength)

次のような場合があります

StringBuffer sb = new StringBuffer("HelloWorld");
// after many iterations and manipulations
sb.setLength(0);
// reuse sb
46

次の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オブジェクトを宣言しないでください。そうしないと、反復ごとに新しいオブジェクトが作成されます。オブジェクトの作成には、システムリソースとスペースが必要であり、時間がかかります。したがって、長期的には、可能であればループ内で宣言しないでください。

18
Aditya Singh

繰り返しごとに新しいStringBuffer(またはもっと良いのは StringBuilder )を作成することをお勧めします。パフォーマンスの違いは実際にはごくわずかですが、コードはより短く簡単になります。

5
Eli Acherkan
buf.delete(0,  buf.length());
5
Suraj Chandran
public void clear(StringBuilder s) {
    s.setLength(0);
}

使用法:

StringBuilder v = new StringBuilder();
clear(v);

読みやすくするために、これが最良のソリューションだと思います。

4
Ido Kessler

すでに良い答えがあります。 StringBufferとStringBuildのパフォーマンスの違いのベンチマーク結果を追加するだけで、ループで新しいインスタンスを使用するか、ループでsetLength(0)を使用します。

要約は次のとおりです。大きなループ内

  • StringBuilderはStringBufferよりもはるかに高速です
  • ループで新しいStringBuilderインスタンスを作成しても、setLength(0)と違いはありません。 (setLength(0)には、新しいインスタンスを作成するよりも非常に小さな利点があります。)
  • ループで新しいインスタンスを作成することにより、StringBufferはStringBuilderよりも遅くなります
  • stringBufferの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

1
Hao
StringBuffer sb = new SringBuffer();
// do something wiht it
sb = new StringBuffer();

このコードはもっと速いと思います。

0
Binh Phung