2

+を使用するのではなく、StringBuilderを使用して複数の文字列を連結する必要があることを理解しています。私の質問は、カットオフポイントは何ですか?

4つ以上の文字列を連結する場合は、StringBuilder.append()を使用する必要があり、それ以外の場合は+を使用する必要があると言われています。そうですか?それとも、stringbuilderが4よりも効率的であるポイントですか?

4

6 に答える 6

2

零。

何年も前、はるか遠くのJavaバージョン(1.4)で、連結を(まだ発明されていないStringBufferスレッドセーフな同等の)に置き換えることを推奨する人もいました。StringBuilder

の導入、およびより高速な「最適化された」コードStringBuilderの再定義により、不要な同期が発生しましたが、の非最適なコードは自動的にの利点を享受しました。StringBuilderStringBuffer+StringBuilder

StringBuilder連結が制御構造またはループと混合されている場合、または文字列の途中でいくつかの文字を更新する必要がある場合に使用します。そうでなければ、コンパイラーは従来の連結でうまく機能するのに十分賢いと思います。

于 2013-03-19T15:06:26.663 に答える
2

Java 1.5 以降、コンパイラはソースで が使用されているStringBuilder場合に自動的に使用+します。

StringのJavadocから:

Java 言語は、文字列連結演算子 ( + ) と、他のオブジェクトの文字列への変換を特別にサポートしています。文字列の連結は、StringBuilder(または StringBuffer) クラスとその追加メソッドを通じて実装されます。

于 2013-03-19T15:00:10.523 に答える
1

jse 5 以降、+ 記号はコンパイル中に stringbuilder に変換されます。

ただし、これには注意点があります。

String blam = a + b + c + d + e;

1 つの stringbuilder と 5 つの追加 (予想どおり) になります。

これ; でも:

String blam = a;
blam += b + c;
blam := d + e;

3 つの文字列ビルダー (1 行に 1 つ) になります。

要点: + 記号は問題ありません。すべてを 1 行のコードにまとめてください。

于 2013-03-19T14:59:25.577 に答える
0

実装に依存するため、定義された答えはありません。3 つ以上の文字列を連結する必要がある場合JVMに使用します。StringBuilder

いいケースに気がつきました。を連結する必要がある場合static final Stringは、使用する必要はありませんStringBuilder。コンパイラは、パフォーマンスを低下させずにそれを連結します。

final class Example {

    public static final String STRING_ONE = "string";
    public static final String STRING_TWO = "string";
    public static final String STRING_THREE = "string";
    public static final String STRING_FOUR = "string";

    public String getBigString() {
        return STRING_ONE + STRING_TWO + STRING_THREE + STRING_FOUR;    
    } 

}

また、私はその質問に非常に興味があります。私は良いテストを実装しようとし、それについてここで尋ねました。

于 2013-03-19T14:59:05.307 に答える
0

コンパイラはプラスをStringBuilderそれ自体に置き換えます。

この場合、回避したい状況がいくつかあります。たとえば、ループで+を使用します。反復ごとに、新しいStringBuilderが作成されます。

この質問を読みたいかもしれません

于 2013-03-19T14:59:23.640 に答える
0

コンパイラはこのようなものを最適化するのに非常に優れているため、通常はあまり得られません。ただし、たとえばループで連結を行っている場合は、代わりに StringBuilder を使用することでいくつかの利点が得られる場合があります。

于 2013-03-19T15:00:38.537 に答える