あまり。
実際の String は依然として不変ですが、コンパイル時に、JVM は、追加の String オブジェクトの作成を StringBuilder に置き換えることができるいくつかの状況を検出できます。
したがって、String を宣言しa
て別の String と連結しても、a
オブジェクトは変更されませんが (不変であるため)、JVM は連結を StringBuilder のインスタンス化に置き換え、両方の String を Builder に追加し、最後にこれを最適化します。結果の文字列を割り当てます。
あなたが持っているとしましょう:
String a = "banana";
String d = a + "123" + "xpto";
JVM がこれを最適化する前は、基本的に、非常に単純なもののために比較的多数の文字列を作成していました。つまり、次のようになります。
- 文字列
- 文字列「123」
- 文字列「xpto」
- 文字列 a + "123"
- 文字列 a+"123"+"xpto"
連結を StringBuilder に変換する最適化により、JVM は連結の中間結果を作成する必要がなくなるため、個々の文字列と結果の文字列だけが必要になります。
これは基本的にパフォーマンス上の理由から行われますが、注意しないと、特定の状況でこれに大きなペナルティを支払うことになることに注意してください。例えば:
String a = "";
for(String str: listOfStrings){
a += str;
}
このようなことを行っていた場合、各反復で JVM は新しいStringBuilder をインスタンス化しlistOfStrings
ます。要素が多数ある場合、これは非常にコストがかかります。この場合、StringBuilder
連結する代わりに、ループ内で a を明示的に使用して追加を行う必要があります。