Этот ответ верен только для Java 8; как указывает @ user85421, +
в строках больше не компилируется в StringBuilder
операции в Java 9 и более поздних версиях.
Теоретически, по крайней мере, есть еще причина использовать StringBuilder
в вашем примере.
Давайте рассмотрим, как работает конкатенация строк: присвоение incremental = incremental + ":" + s;
фактически создает новый StringBuilder
, добавляет к нему incremental
путем копирования, затем добавляет ":"
к нему путем копирования, затем добавляет s
к нему путем копирования, затем вызывает toString()
для получения результата путем копирования и присваивает ссылку на новую строку переменной incremental
. Общее количество символов, скопированных из одного места в другое, составляет (N + 1 + s.length()) * 2
, где N
- исходная длина incremental
, поскольку каждый символ копируется в буфер StringBuilder
один раз, а затем снова возвращается обратно.
Напротив, если вы используете StringBuilder
явно - один и тот же StringBuilder
на всех итерациях - тогда внутри l oop вы бы написали incremental.append(":").append(s);
, а затем явно вызвали toString()
для построения строка для добавления в набор. Общее количество копируемых здесь символов будет (1 + s.length()) * 2 + N
, поскольку ":"
и s
должны копироваться в StringBuilder
и из него, а N
символы из предыдущего состояния должны копироваться только out из StringBuilder
в методе toString()
; их также не нужно копировать, потому что они уже были там.
Таким образом, используя StringBuilder
вместо конкатенации, вы копируете N
меньше символов в буфер в каждой итерации, и такое же количество символов вне буфера. Значение N
возрастает с первоначально 0 до суммы длин всех строк (плюс количество двоеточий), поэтому общая экономия составляет квадратичное значение c в сумме длин строк. Это означает, что экономия может быть весьма значительной; Я оставлю это кому-то еще, чтобы сделать эмпирические измерения, чтобы увидеть, насколько это важно.