編集:この変更を行うコンパイラでさえ(私は知りませんでした)、文字列連結を使用すると、StringBuilderを使用するよりも遅くなります。(間違った =>いいえ、コンパイラは StringBuilder/StringBuffer を使用しません)。簡単なベンチマークを作成するだけでテストできます。+ 演算子は Java for Strings で「オーバーロード」されていますが、言語は演算子のオーバーロードをサポートしていません。
StringBuilder/StringBuffer をテストするには、次のようなことを試してください。
String str = "";
StringBuffer sbf = new StringBuffer();
StringBuilder sb = new StringBuilder();
int nTests = 100;
int nConcats = 1000;
long initialTime = 0L;
long afterStrTime = 0L;
long afterSbfTime = 0L;
long afterSbTime = 0L;
for ( int i = 0; i < nTests; i++ ) {
initialTime = System.currentTimeMillis();
str = "";
sbf = new StringBuffer();
sb = new StringBuilder();
for ( int j = 0; j < nConcats; j++ ) {
str += "foo"; // or str = str + "foo"
}
afterStrTime = System.currentTimeMillis();
for ( int j = 0; j < nConcats; j++ ) {
sbf.append( "foo" );
}
afterSbfTime = System.currentTimeMillis();
for ( int j = 0; j < nConcats; j++ ) {
sb.append( "foo" );
}
afterSbTime = System.currentTimeMillis();
}
System.out.printf( "%d milliseconds to perform %d concatenations on String\n", afterStrTime - initialTime, nConcats );
System.out.printf( "%d milliseconds to perform %d concatenations on StringBuilder\n", afterSbfTime - afterStrTime, nConcats );
System.out.printf( "%d milliseconds to perform %d concatenations on StringBuffer\n", afterSbTime - afterSbfTime, nConcats );
StringBuilder は同期されていない (StringBuffer は同期されている) ため、StringBuffer よりも高速であり、どちらも String よりも高速であることがわかります。