Предположим, у вас есть n
строки, каждая длиной 1, которые вы прочитали из своего ввода - для простоты.
Использование operator+
на стрингах во время чтения создаст объект String
каждый раз, когда вы объединяете строки, поэтому вы получаете строки длиной 1,2,3, ..., n
Таким образом, общее использование памяти для объединенных строк составляет 1 + 2 + .. + n = O(n^2)
в дополнение к n
строкам, которые вы читаете из ввода
в то время как если вы используете StringBuilder
для создания окончательной строки, вы фактически создаете n
- для ввода [каждая длиной 1] и один объект для конечной строки - размером n
, поэтому общее использование памяти 1 + 1 + .. + 1 + n = O(n)
Итак, даже если вы используете sb.append(String)
- использование пространства асимптотически лучше, чем создание всех промежуточных строк - поскольку вам не нужно создавать промежуточные объекты String.
Кроме того - производительность [время] должна быть лучше при использовании StringBuilder
- и потому, что вы создаете меньше объектов, и оба из-за меньшего использования памяти - gc не нужно работать так же усердно, как при наивной конкатенации строк .
(*) Обратите внимание, что легко заметить, что вышеупомянутое все еще верно для любой длины строк.