s+=String.valueOf(j);
необходимо выделять новый String
объект каждый раз, когда он вызывается, и это дорого. StringBuffer
нужно только увеличить некоторое внутреннее представление, когда содержащаяся строка слишком велика, что происходит гораздо реже.
Вероятно, было бы еще быстрее, если бы вы использовали StringBuilder
, который является несинхронизированной версией StringBuffer.
Следует отметить, что хотя это относится к циклам и многим другим случаям, это не обязательно относится ко всем случаям, когда строки объединяются с использованием +
:
String helloWorld = getGreeting() + ", " + getUsername() + "!";
Здесь компилятор, вероятно, оптимизирует код так, как считает нужным, что может создавать или не создавать StringBuilder
, поскольку это также дорогостоящая операция.