2012-08-13 5 views
26

可能性の重複:私は疑問に思って
StringBuilder vs String concatenation in toString() in Javaコンパイラが文字列連結を自動的にStringBuilderに変換する場合、なぜStringBuilderを明示的に使用するのですか?

、コンパイラが内部で文字列の連結を実行する2つの文字列を追加するのStringBuilderを使用しているため、その後、ポイント何だと私は気にすべき理由使用しますStringBuilderは、文字列の連結がすでにあなたのために仕事をしていた場合ですか?その他の具体的な理由はありますか?

答えて

53

このように、a + " = " + bのような単純な文字列連結式ではなく、StringBuilderを使用しないでください。後者は入力がより簡単で読みやすく、コンパイラは内部でStringBuilderを使用しますので、書き換えてもパフォーマンス上の利点はありません。

しかし、StringBuilderは、ループ内に多数の文字列を連結する場合に便利です。次のコードは非効率的です。実行にはO(n )時間が必要で、多くの一時的な文字列が作成されます。

String result = ""; 
for (int i = 0; i < foo.length; ++i) 
{ 
    result += bar(foo[i]); // Bad 
} 

代わりにこれを試してみてください:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < foo.length; ++i) 
{ 
    sb.append(bar(foo[i])); 
} 
String result = sb.toString(); 

コンパイラは単純なa + b + c表現を最適化します。上記のコードを自動的に最適化することはできません。

+3

@JohanSjöbergはい、実際はそうです。 'result = = bar(foo [i])'を実行すると、(javacを仮定して) 'result = new StringBuilder()。append(result).append(foo [i])。toString()'のようなコードが生成されます。これは、1つの 'StringBuilder'を使うよりもはるかに多くの作業であることに注意してください。 – oldrinb

+0

@JohanSjöberg重要な点は、サンプルが同等ではないことです。 – oldrinb

+0

私はまだそれほど明確ではないのですか?それは最初のサンプルの連結を行う前に古い文字列(前)をコピーする必要があるからですか? – peter

3

string concatinationがstringbuilderを内部的に使用しているとしますか?単純なコンカットが最適化されるかもしれませんが、これは間違いありません。

String s = ""; 

for (int i = 0; i < 1000; i++){ 
    for (int j = 0; j < 1000; j++){ 
    s+= "" + i + j 
} 
} 
+1

これは内部的に何でしょうか? (コンパイラはjavacであると仮定します)。 – peter

+0

@ user1389813 's = new StringBuilder.append(" ")。append(i).append(j).toString(); – oldrinb

+0

だから、連結を実行するために新しいStringBuilderを作成するたびに、それが悪くて遅いのはなぜですか? – peter

関連する問題