Если вам важна скорость, вам следует использовать как можно меньше памяти для копирования. Таким образом, требуется работать с массивами символов.
public static String repeatString(String what, int howmany) {
char[] pattern = what.toCharArray();
char[] res = new char[howmany * pattern.length];
int length = pattern.length;
for (int i = 0; i < howmany; i++)
System.arraycopy(pattern, 0, res, i * length, length);
return new String(res);
}
Для проверки скорости подобный оптимальный метод с использованием StirngBuilder выглядит так:
public static String repeatStringSB(String what, int howmany) {
StringBuilder out = new StringBuilder(what.length() * howmany);
for (int i = 0; i < howmany; i++)
out.append(what);
return out.toString();
}
и код для проверки:
public static void main(String... args) {
String res;
long time;
for (int j = 0; j < 1000; j++) {
res = repeatString("123", 100000);
res = repeatStringSB("123", 100000);
}
time = System.nanoTime();
res = repeatString("123", 1000000);
time = System.nanoTime() - time;
System.out.println("elapsed repeatString: " + time);
time = System.nanoTime();
res = repeatStringSB("123", 1000000);
time = System.nanoTime() - time;
System.out.println("elapsed repeatStringSB: " + time);
}
А вот и результаты запуска из моей системы:
elapsed repeatString: 6006571
elapsed repeatStringSB: 9064937
Обратите внимание, что тест для цикла заключается в том, чтобы запустить JIT и получить оптимальные результаты.