Еще быстрее:
public class ScratchPad {
private static String a;
public static void main( String[] args ) throws Exception {
long time = System.currentTimeMillis();
StringBuilder sb = new StringBuilder( 128 );
for( int i = 0; i < 10000000; i++ ) {
// Resetting the string is faster than creating a new object.
// Since this is a critical loop, every instruction counts.
//
sb.setLength( 0 );
sb.append( "someString" );
sb.append( "someString2" );
sb.append( "someStrin4g" );
sb.append( "someStr5ing" );
sb.append( "someSt7ring" );
setA( sb.toString() );
}
System.out.println( System.currentTimeMillis()-time );
}
private static void setA( String aString ) {
a = aString;
}
}
В философии написания твердого кода внутренняя работа метода должна быть скрыта от объектов, использующих метод. Таким образом, с точки зрения системы не имеет значения, переопределите ли вы StringBuilder внутри цикла или вне цикла. Поскольку объявление его вне цикла выполняется быстрее и это не делает код более сложным для чтения, затем повторно используйте объект, а не восстанавливайте его.
Даже если код был более сложным, и вы наверняка знали, что создание объектов было узким местом, прокомментируйте его.
Три ответа с этим ответом:
$ java ScratchPad
1567
$ java ScratchPad
1569
$ java ScratchPad
1570
Три прогона с другим ответом:
$ java ScratchPad2
1663
2231
$ java ScratchPad2
1656
2233
$ java ScratchPad2
1658
2242
Хотя это и несущественно, установка начального размера буфера StringBuilder
даст небольшой выигрыш.