web-dev-qa-db-ja.com

コンパイラが文字列連結を自動的にStringBuilderに変換するのに、なぜStringBuilderを明示的に使用するのですか?

可能性のある複製:
JavaのtoString()でのStringBuilderとStringの連結

コンパイラーが内部的にStringBuilderを使用してString連結を実行するときにStringsを追加するので、私は不思議に思っています。その理由は何ですか。また、String連結がすでに機能している場合、なぜStringBuilderを使用する必要があるのでしょうか。他に具体的な理由はありますか?

38
peter

先ほど触れたように、a + " = " + bなどの単純な文字列連結式の代わりにStringBuilderを使用しないでください。後者の方が入力が速く、読みやすく、コンパイラは内部的にStringBuilderを内部で使用するため、書き換えることによるパフォーマンス上の利点はありません。

ただし、StringBuilderは、ループ内で多数の文字列を連結している場合に役立ちます。次のコードは非効率的です。 O(n2)実行して多くの一時的な文字列を作成する時間。

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式のみを最適化します。上記のコードを自動的に最適化することはできません。

65
Mark Byers

内部でstringbuilderを使用して文字列連結を想定しているのはどこですか?単純な連結が最適化されてしまう可能性がありますが、これは間違いなく次のようにはなりません。

String s = "";

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