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

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

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

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

Решение

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

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();
Комментарии (11)