Ваша предпосылка «что использование оператора конкатенации« + »для построения строк очень неэффективна», неверна.Во-первых, сама конкатенация строк не является дешевой операцией, так как она подразумевает создание новой строки, содержащей все конкатенированные строки, следовательно, необходимо копировать содержимое символа.Но это всегда применимо, независимо от того, как вы это делаете.
Когда вы используете оператор +
, вы говорите, что хотите сделать, не говоря, как это сделать.,Даже спецификация языка Java не требует конкретной стратегии реализации, за исключением того, что константа времени компиляции должна выполняться во время компиляции.Таким образом, для констант времени компиляции оператор +
является наиболее эффективным решением¹.
На практике все обычно используемые компиляторы из Java 5 в Java 8 генерируют код с использованием StringBuilder
под капотом (до Java 5 они использовали StringBuffer
).Это относится к таким утверждениям, как ваше, поэтому замена его на использование StringBuilder
вручную не принесет особого успеха.Вы могли бы быть немного лучше, чем типичный код, сгенерированный компилятором, предоставляя разумную начальную емкость, но это все.
Начиная с Java 9, компиляторы генерируют инструкцию invokedynamic
, которая позволяет среде выполнения предоставлять фактический код, выполняющийконкатенация.Это может быть код StringBuilder
, похожий на тот, который использовался в прошлом, но также и нечто совершенно иное.В частности, предоставляемый во время выполнения код может получить доступ к специфическим функциям реализации, чего не может сделать код приложения.Поэтому теперь конкатенация строк с помощью +
может быть даже быстрее, чем код на основе StringBuilder
.
Поскольку это применимо только к одному выражению конкатенации, при выполнении строкового построения с использованием нескольких операторов или даже цикла,последовательное использование StringBuilder
в течение всей конструкции может быть быстрее, чем операции множественной конкатенации.Однако, поскольку код выполняется в оптимизирующей среде, когда JVM распознает некоторые из этих шаблонов, даже об этом нельзя сказать наверняка.
Это время вспомнить старое правило, чтобы попытаться только оптимизироватьпроизводительность, когда есть реальная проблема с производительностью.И всегда проверяйте с помощью объективных измерительных инструментов, действительно ли попытка оптимизации повышает производительность.Существует множество распространенных мифов, неправильных или устаревших, о приемах оптимизации производительности.
¹, за исключением случаев, когда вы повторяете детали и хотите уменьшить размер файла класса