StringBuilder
vsの使用は、+
実際に使用しているコンテキストに依存すると思います。
通常、JDK 1.6以降を使用すると、コンパイラは。を使用して文字列を自動的に結合しますStringBuilder
。
String one = "abc";
String two = "xyz";
String three = one + two;
これは次のようにコンパイルString three
されます:
String three = new StringBuilder().append(one).append(two).toString();
これは非常に役立ち、実行時間を節約できます。ただし、このプロセスが常に最適であるとは限りません。たとえば、次のようにします。
String out = "";
for( int i = 0; i < 10000 ; i++ ) {
out = out + i;
}
return out;
バイトコードにコンパイルしてから、生成されたバイトコードを逆コンパイルすると、次のようになります。
String out = "";
for( int i = 0; i < 10000; i++ ) {
out = new StringBuilder().append(out).append(i).toString();
}
return out;
コンパイラーは内部ループを最適化しましたが、確かに可能な限り最良の最適化を行っていません。コードを改善するために、次のものを使用できます。
StringBuilder out = new StringBuilder();
for( int i = 0 ; i < 10000; i++ ) {
out.append(i);
}
return out.toString();
これはコンパイラで生成されたコードよりも最適であるため、効率的なコードが必要な場合は、 StringBuilder
/クラスを使用してコードを作成する必要があります。StringBuffer
現在のコンパイラは、ループ内の文字列の連結を処理するのに優れていませんが、これは将来変更される可能性があります。
手動で適用する必要がある場所を注意深く調べてStringBuilder
、コードの可読性を低下させない場所で使用する必要があります。
注:私はJDK 1.6を使用してコードをコンパイルし、javap
バイトコードを吐き出すプログラムを使用してコードを逆コンパイルしました。解釈はかなり簡単で、コードを最適化しようとするときに参照するのに役立つことがよくあります。コンパイラはバックグラウンドでコードを変更するので、コンパイラが何をするかを見るのは常に興味深いことです。