Поскольку строки неизменяемы в таких языках, как Java и C #, каждый раз при объединении двух строк необходимо создавать новую строку, в которую копируется содержимое двух старых строк.
Допустим, строки длиной в среднем c символами.
Теперь первая конкатенация должна копировать только 2 * c символа, но последняя должна копировать конкатенацию первых n-1 строк длиной (n-1) * c символов и самой последней. , длиной c символов, всего n * c символов. Для n конкатенаций это составляет n ^ 2 * c / 2 символов, что означает алгоритмическую сложность O (n ^ 2).
Однако в большинстве случаев на практике эта квадратичная сложность не будет заметна (как показывает Джефф Этвуд в записи блога, на которую ссылается Роберт К. Картейно), и я бы посоветовал просто написать код как можно более читабельным.
Однако есть случаи, когда это имеет значение, и использование O (n ^ 2) в таких случаях может быть смертельным.
На практике я видел это, например, для генерации больших файлов Word XML в памяти, включая изображения в кодировке base64. Это поколение занимало более 10 минут из-за конкатенации строк O (n ^ 2). После того как я заменил конкатенацию с помощью + на StringBuilder, время выполнения для того же документа сократилось до 10 секунд.
Точно так же я видел часть программного обеспечения, которая генерировала невероятно большой кусок кода SQL в виде строки, использующей + для конкатенации. Я даже не ждал, пока это закончится (ждал уже более часа), но просто переписал его с помощью StringBuilder. Эта более быстрая версия завершилась в течение минуты.
Короче говоря, просто делайте то, что наиболее читабельно / проще всего написать, и думайте об этом только тогда, когда вы будете создавать чертову огромную строку: -)