В Java есть разница в производительности между использованием оператора "+" и StringBuilder?


Ответ 1:

В Java есть разница в производительности между использованием оператора "+" и StringBuilder?

В одной строке, например:

Строка string1 = «один» + «два»;
String string2 = new StringBuilder («один»). Append («два»). ToString ();

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

Однако, если ваши строки объединяются в отдельные строки или, скажем, в цикл for:

String string1 = «»;
StringBuilder sb = new StringBuilder ();

for (Целое число i = 0; i <5; i ++) {
  строка1 = строка1 + i.toString ();
  sb.append (i.toString ());
}

String string2 = sb.toString ();

Тогда использование StringBuilder более «эффективно» и иногда является предпочтительным способом построения более сложной строки. Насколько я знаю, в настоящее время ни один компилятор Java не будет оптимизировать повторение + для StringBuilder.


Ответ 2:

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

Современные JVM могут оптимизировать конкатенацию строк с помощью «+» и превратить ее в StringBuilder, и, поскольку они могут видеть, как долго будет получаться результирующая строка, они могут выделить правильный размер для StringBuilder в начале. Если вы создадите StringBuilder самостоятельно, используя размер массива по умолчанию, массив char, возможно, придется увеличить позже, что включает в себя копирование массива, поэтому на самом деле может быть медленнее.

Начиная с Java 9, конкатенация строк стала намного более оптимизированной, и стратегия решалась во время выполнения.

Если вы постоянно добавляете к строке в цикле, то, возможно, вы не ошибетесь, используя StringBuilder, но заранее выделите правильный размер, если он известен. За пределами цикла придерживайтесь "+" всякий раз, когда это будет более читабельным; и верьте, что JVM лучше оптимизирует, чем вы.