1

私が行った場合:

StringBuilder sb = new StringBuilder();
sb.append("somestring" + "hello" + "more strings" + "last one");

それは次と同じですか:

string s = "somestring";
s + "hello" + "more strings" + "last one";

文字列ビルダーを使用しても意味がありませんか?それにより、以下を使用する必要があります。

StringBuilder sb = new StringBuilder();
sb.append("somestring");
sb.append("hello");
sb.append("more strings");
sb.append("last one");
4

7 に答える 7

4

あなたの長い質問に対する短い答えは「はい」です。

于 2012-04-05T15:11:04.047 に答える
4

これがコードのそのフラグメントでのすべての使用でStringBuilderある場合、それは確かに無意味です。への最初の呼び出しの後で追加を続ける場合append、それは完全に無意味ではありません。ただし、最後の例は最初の2つよりもはるかに理にかなっています。

あなたの投稿の定数は明確にするためだけのものだと思います。それらが実際に定数である場合、コンパイラは定数畳み込みを実行し、最初の例を次のようにします。

StringBuilder sb = new StringBuilder();
sb.append("somestringhello");
于 2012-04-05T15:11:37.550 に答える
2

StringBuilderStringBuffer要素を複数回追加する場合は、文字列「+」操作の代わりに使用する必要があります。のように:

String s = new String();
for(int i=0; i < x; i++){
  s += i;
}

これは(の線に沿ったもの)に変換されるため:

String s = new String();
for(int i=0; i < x; i++){
   StringBuffer sb = new StringBuffer();
   sb.append(s);
   sb.append(i)
   s = sb.toString();
}

各反復(同等のバイトコード内)で、を作成し、StringBufferそれをに変換しStringます。

多くの情報源がありますが、すなわち; これこれはOKです。私は2010年頃にこの問題について小さな調査を行いましたが、この問題に関する私の知識はそれにさかのぼります。それ以降に追加の改善がある場合、私はそれを認識していません。

于 2012-04-05T15:24:53.983 に答える
1

StringBuilderを使用するコードと、単にStringsを連結するコードのコンパイル済み出力を見ると、最新のコンパイラーは、適切な場合に関係なく、通常StringBuilderを使用することがわかります。そうは言っても、最初の例では、's = s+"hello"と言う必要があることに注意してください。結果をキャッチするために。

于 2012-04-05T15:15:09.267 に答える
0

StringBuilderは変更可能ですが、Stringは変更できません。StringBuilderは、これらの文字列操作をより効率的にします。あなたの例のような小さな作品の場合、おそらく違いに気付かないでしょう。

于 2012-04-05T15:11:17.700 に答える
0

最初のケースでは、固定リテラルがコンパイラーによって検出され、単一の値としてインライン化されます。お気に入り

sb.append("somestring" + "hello" + "more strings" + "last one");

として扱われます

sb.append("somestringhellomore stringslast one");

したがって、StringBuilderに追加されるのは1回だけです。


2番目のケースでは、複数回追加されます。

于 2012-04-05T15:16:17.110 に答える
0

文字列javadocsによると、演算子+StringBuilderとにかく変換​​されます。

2つの大きな違いは次のとおりです。

  1. 例のようにリテラルのセットを連結する場合。定数畳み込みは、コンパイル時にこれらの個別の文字列を単一の文字列に変換し、実行時にこの操作が実行されるのを防ぎます。

    "somestring" + "hello" + "more strings" + "last one"になります"somestringhellomore stringslast one"

  2. ループまたは他の分岐構造で連結する場合。を使用すると、実行時に多くのメモリと処理能力を使用+する複数のインスタンスが作成されます。StringBuilderhttp://nicklothian.com/blog/2005/06/09/on-java-string-concatenation/を参照)

于 2012-04-10T07:19:02.627 に答える