Предположим, у меня есть выражение на 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();