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

Что происходит, когда Java Compiler видит много конкатенаций строк в одной строке?

Предположим, что у меня есть выражение в Java, например:

String s = "abc" + methodReturningAString() + "ghi" + 
                anotherMethodReturningAString() + "omn" + "blablabla";

Какое поведение JDK-компилятора Java по умолчанию? Это просто делает пять конкатенаций или есть умный трюк производительности?

4b9b3361

Ответ 1

Он генерирует эквивалент:

String s = new StringBuilder("abc")
           .append(methodReturningAString())
           .append("ghi")
           .append(anotherMethodReturningAString())
           .append("omn")
           .append("blablabla")
           .toString();

Он достаточно умен, чтобы предварительно конкатенировать статические строки (т.е. "omn" + "blablabla"). Если хотите, вы можете использовать StringBuilder "трюк производительности". Это определенно лучше для производительности, чем выполнение пяти конкатенаций, что приводит к четырем ненужным временным строкам. Кроме того, использование StringBuilder было улучшением производительности в (я думаю) Java 5; до этого использовался StringBuffer.

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

String s = "abc" + "def" + foo() + "uvw" + "xyz";

он будет скомпилирован следующим образом:

String s = new StringBuilder("abcdef")
           .append(foo())
           .append("uvw")
           .append("xyz")
           .toString();