89

私は、ベストプラクティスとは何か、そしてさまざまなケースで文字列リテラルと変数を連結する理由を理解しようとしています。たとえば、私がこのようなコードを持っている場合

StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
    .append(B_String).append("CCCCCCCCCCC").append(D_String)
    .append("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
    .append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");

これはそれを行う方法ですか?この投稿から、Stringsの演算子がStringBuilderの新しいインスタンスを作成し、オペランドを連結して、String変換を返すことに気付き+ました。これは、単に呼び出すよりもはるかに多くの作業のよう.append()です。ですから、それが本当なら、それは問題外です。しかし、どうString.concat()ですか?.append()すべての連結に使用するのは適切ですか?または、変数の場合、リテラルに.concat()?を追加してもかまいません。

StringBuilder sb = new StringBuilder("AAAAAAAAAAAAA")
    .append(B_String.concat("CCCCCCCCCCC")).append(D_String
    .concat("EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE")
    .concat("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"));

これらの状況を回避するためのベストプラクティスとパフォーマンスの一般的なルールは何ですか?私の仮定は正しいですか+、それは本当に使用されるべきではありませんか?

4

9 に答える 9

187

+オペレーター

String s = s1 + s2

舞台裏では、これは次のように翻訳されています。

String s = new StringBuilder(s1).append(s2).toString();

ここにある場合、どれだけの余分な作業が追加されるか想像してみてs1 + s2ください:

stringBuilder.append(s1 + s2)

それ以外の:

stringBuilder.append(s1).append(s2)

複数の文字列+

次の点に注意してください。

String s = s1 + s2 + s3 + ... +sN

は次のように翻訳されます。

String s = new StringBuilder(s1).append(s2).append(s3)...apend(sN).toString();

concat()

String s = s1.concat(s2);

Stringと の両方にchar[]適合する配列を作成します。この新しい配列に内容をコピーします。実際には、オペレーターよりも少ない作業で済みます。s1s2s1s2+

StringBuilder.append()

必要に応じて拡張される内部char[]配列を維持します。char[]内部のものが十分に大きい場合、余分なものは作成されません。

stringBuilder.append(s1.concat(s2))

s1.concat(s2)余分なchar[]配列を作成してコピーs1s2、その新しい配列の内容を internal にコピーするだけであるため、パフォーマンスも低下していStringBuilder char[]ます。

つまり、append()常に使用して生の文字列を追加する必要があります (最初のコード スニペットは正しいです)。

于 2012-04-09T20:00:29.110 に答える
16

コンパイラは + 連結を最適化します。

そう

int a = 1;
String s = "Hello " + a;

に変換されます

new StringBuilder().append("Hello ").append(1).toString();

+ 演算子を使用する理由を説明する優れたトピックがここにあります。

于 2012-04-09T19:57:50.713 に答える
2

常に使用する必要がありますappend

concat+新しい文字列を作成するので、私が思うようにかなりです。

concatまたは2つの最終的な文字列を使用する場合+、JVMは最適化を行うことができるため、この場合追加を行うのと同じです。

于 2012-04-09T19:58:25.850 に答える
1

正確に 2 つの String を連結する場合は、String.concat を使用します (両方の String に適合する新しい char-array を作成し、両方の String の char 配列をコピーして新しい String を作成します)。

複数 (2 つ以上) の文字列を 1 行に連結する場合は、+ または StringBuilder.append を使用します。コンパイラは + を StringBuilder.append に変換するため、問題ありません。これは、必要に応じて大きくなる 1 つの char 配列を維持するため、複数の文字列に適しています。

複数行にわたって複数の String を連結する場合は、1 つの StringBuilder を作成し、append-method を使用します。最後に、StringBuilder への String の追加が完了したら、その .toString() メソッドを使用して、そこから String を作成します。複数の行を連結する場合、これは 2 番目の方法よりも高速です。2 番目の方法は各行に新しい StringBuilder を作成し、文字列を追加してから String にキャストし直すためです。3 番目の方法は全体で 1 つの StringBuilder のみを使用します。

于 2014-01-27T10:03:19.233 に答える
0

演算子を使用する+のがベスト プラクティスです。また、シンプルで読みやすいです。

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

公式ドキュメント: https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

于 2016-08-10T03:34:26.193 に答える