Подтвердить что ты не робот

Использование строки + в concat в Java

У меня есть огромная строка, как показано ниже:

String str = "aaaaaaa" 
        + "bbbbbbbb" 
        + "cccccccc" 
    .... 

        + "zzzzzzzz";  // about 200 lines long

Это большая потеря памяти? Будет ли лучше поставить его в одну строку или использовать StringBuilder? Это делается для создания длинного sql.

4b9b3361

Ответ 1

Нет. Компилятор выполнит конкатенацию во время компиляции, если все ваши строки являются постоянными (как в вашем вопросе). Таким образом, результат заканчивается лучше, чем версия StringBuilder.

Он будет использовать StringBuilder (или StringBuffer) для выполнения конкатенации любых непостоянных частей в противном случае.

Итак, скомпилированная версия:

String x = "a" + "b";

должно быть точно таким же, как:

String x = "ab";

Обратите внимание, что "непостоянные" части могут означать, что вы иногда можете получить (очень незначительную) дополнительную эффективность с помощью брекетинга с умом. Например:

int value = ...;
String x = "a" + value + "b" + "c";

... менее эффективен, чем:

int value = ...;
String x = "a" + value + ("b" + "c");

... как первый добавляет "b" и "c" отдельно. Эффективная версия эквивалентна tO:

int value = ...;
String x = "a" + value + "bc";

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

Ответ 2

В текущих версиях Java каждая операция + (конкатенация) автоматически скомпилируется в операцию StringBuilder append(). Однако, если он внутри цикла, он создаст новый StringBuilder для каждой итерации, отрицая его эффект, поэтому вам будет лучше управлять StringBuilder явно.

Ответ 3

Нет. Компилятор оптимизирует это для вас в StringBuilder.

Изменить: как указывает Луи Вассерман, он также будет комбинировать литералы String для вас, поэтому вышеприведенное выражение будет просто одной строкой во время компиляции.

Ответ 4

AFAIK JVM внутренне имеет пул строк, каждая созданная вами String хранится там, отбрасывая самые старые/наименее используемые (im не уверен, как он выбирает какие). Если вы явно вызываете String.intern(), вы сообщаете JVM о том, чтобы положить String в пул.

когда вы объединяете две строки, используя +, вы получаете три строки в пуле. Если вы соедините a + b + c, вы получите в итоге 5 строк (a, b, ab, c, abc)

По крайней мере, это то, что я вспоминаю о старых версиях JVM, но Luiggi вполне вероятно прав, что на более новых его внутренне оптимизированный

Ответ 5

Код:

String str = "aaaaaaa" + "bbbbbbbb" + "cccccccc";

преобразуется во время компиляции:

String str = (new StringBuilder()).append("aaaaaaa").append("bbbbbbbb").append("cccccccc").toString();

Таким образом, нет никакой разницы в использовании StringBuilder.

Там очень хорошая статья, которая тесно сравнивает производительность concat (+) с StringBuilder и StringBuffer в комплекте с линейными графами:

StringBuilder vs StringBuffer vs String.concat - Сделано правильно.