Когда использовать StringBuilder в Java

Предполагается, что обычно предпочтительнее использовать StringBuilder для конкатенации строк в Java. Это всегда так?

Я имею в виду следующее: накладные расходы на создание объекта StringBuilder, вызов метода append() и, наконец, toString() уже меньше, чем объединение существующих строк с помощью оператора + для двух строк или это рекомендуется только для более (чем двух) строк?

Если существует такой порог, от чего он зависит (возможно, длина строки, но каким образом)?

И, наконец, вы могли бы обменять читабельность и краткость конкатенации + для производительности StringBuilder в меньших случаях, таких как две, три или четыре строки?

Явное использование StringBuilder для регулярных конкатенаций упоминается как устаревшее в устаревшие советы по оптимизации Java, а также Java городских мифов.

Ответ 1

Если вы используете конкатенацию String в цикле, что-то вроде этого,

String s = "";
for (int i = 0; i < 100; i++) {
    s += ", " + i;
}

тогда вы должны использовать StringBuilder (not StringBuffer) вместо String, потому что он намного быстрее и потребляет меньше памяти.

Если у вас есть один оператор,

String s = "1, " + "2, " + "3, " + "4, " ...;

то вы можете использовать String s, потому что компилятор будет автоматически использовать StringBuilder.

Ответ 2

Ральф ответ сказочный. Я предпочел бы использовать класс StringBuilder для создания/украшения String, потому что его использование больше похоже на шаблон Builder.

public String decorateTheString(String orgStr){
            StringBuilder builder = new StringBuilder();
            builder.append(orgStr);
            builder.deleteCharAt(orgStr.length()-1);
            builder.insert(0,builder.hashCode());
            return builder.toString();
}

Он может использоваться в качестве помощника/построителя для построения строки, а не самой строки.

Ответ 3

Как правило, всегда используйте более читаемый код и рефакторинг, только если производительность является проблемой. В этом конкретном случае самый последний JDK фактически оптимизирует код в версии StringBuilder в любом случае.

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

Ответ 5

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

Ответ 6

Оператор + использует public String concat(String str) внутренне. Этот метод копирует символы двух строк, поэтому он имеет требования к памяти и сложность выполнения, пропорциональные длине двух строк. StringBuilder работает более эффективно.

Однако я прочитал здесь, что код конкатенации с использованием + operater изменен на StringBuilder на пост-компиляторах Java 4. Так что это может быть не проблема. (Хотя я действительно проверял бы это утверждение, если бы я зависел от него в моем коде!)

Ответ 8

Проблема с конкатенацией строк заключается в том, что она приводит к копированию объекта String со всеми соответствующими затратами. StringBuilder не является потокобезопасным и, следовательно, быстрее, чем StringBuffer, который раньше был предпочтительным выбором до Java 5. Как правило, вы не должны конкатенации строк в цикле, который будет вызываться часто. Я думаю, что здесь можно сделать несколько конкатенаций, и вам не будет больно, если вы не говорите о сотнях, и это, конечно, зависит от ваших требований к производительности. Если вы делаете вещи в реальном времени, вы должны быть очень осторожны.

Ответ 9

Материалы сертификации Microsoft решают этот же вопрос. В мире .NET накладные расходы для объекта StringBuilder упрощают объединение двух объектов String. Я бы предположил аналогичный ответ для строк Java.