Использование строки + в concat в Java
У меня есть огромная строка, как показано ниже:
String str = "aaaaaaa"
+ "bbbbbbbb"
+ "cccccccc"
....
+ "zzzzzzzz"; // about 200 lines long
Это большая потеря памяти? Будет ли лучше поставить его в одну строку или использовать StringBuilder
?
Это делается для создания длинного sql.
Ответы
Ответ 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 - Сделано правильно.