String.format() против производительности конкатенации строк

есть ли разница в производительности между этими двумя идиомами?

String firstStr = "Hello ";
String secStr   = "world";
String third = firstStr +  secStr;

и

String firstStr = "Hello ";
String secStr   = "world";
String third = String.format("%s%s",firstStr , secStr);

Я знаю, что конкатенация с оператором + плохо для производительности, особенно если операция выполняется много раз, но как насчет String.format()? это то же самое или может помочь повысить производительность?

Ответ 1

Второй будет еще медленнее (если вы посмотрите на исходный код String.format(), вы увидите, почему). Просто потому, что String.format() выполняет гораздо больше кода, чем простая конкатенация. И в конце дня обе версии кода создают 3 экземпляра String. Есть другие причины, а не связанные с производительностью, использовать String.format(), как уже указывали другие.

Ответ 2

Прежде всего, позвольте мне просто отложить отказ от преждевременной оптимизации. Если вы не уверены, что это будет горячая точка в вашей программе, просто выберите конструкцию, которая лучше всего подходит вашей программе.

Если вы достаточно уверены, и хотите иметь хороший контроль над конкатенацией, просто используйте StringBuilder напрямую. Это то, что делает встроенная операция конкатенации, и нет никаких оснований предполагать, что она медленная. Пока вы сохраняете один и тот же StringBuilder и продолжаете добавлять к нему, вместо того, чтобы рисковать создавать несколько строк (которые должны быть "инициализированы" ранее созданными данными), вы будете иметь надлежащую производительность O (n), Тем более, если вы убедитесь, что инициализируете StringBuilder с надлежащей емкостью.

Однако также сказано, что StringBuilder - это то, что использует встроенная операция конкатенации, поэтому, если вы просто сохраняете все свои конкатенации "inline", то есть используйте A + B + C + D, скорее чем e = A + B, за которым следует f = C + D, за которым следует e + f (таким образом, тот же StringBuilder используется и добавляется в течение всей операции) - тогда нет оснований предполагать, что это будет медленным.

EDIT: В ответ на ваш комментарий я бы сказал, что String.format всегда медленнее. Даже если он добавляет оптимально, он не может сделать это быстрее, чем StringBuilder (и, следовательно, также операция конкатенации), в любом случае, но он также должен создать объект Formatter, провести синтаксический анализ входной строки и так далее на. Так что там больше, но он все еще не может выполнять основную операцию быстрее.

Кроме того, если вы смотрите внутри, как работает Formatter, вы обнаружите, что он также (по умолчанию) использует StringBuilder, как и операция конкатенации. Поэтому он выполняет ту же самую основную операцию, то есть кормит StringBuilder строками, которые вы им даете. Это просто делает это гораздо более крутым способом.

Ответ 3

Как описано в этом отличном ответе, вы предпочитаете использовать String.format, но главным образом из-за проблем с локализацией.

Предположим, что вам пришлось предоставлять разные тексты для разных языков, в этом случае, используя String.format, вы можете просто подключить новые языки (используя файлы ресурсов). Но конкатенация оставляет грязный код.

Смотрите: Лучше ли использовать String.format над строкой Конкатенация в Java?