Suppose I have an expression in Java such as:
String s = "abc" + methodReturningAString() + "ghi" + anotherMethodReturningAString() + "omn" + "blablabla";
What's the behaviour of the Java's default JDK compiler? Does it just makes the five concatenations or there is a smart performance trick done?
Concatenating Strings Using the concat() method − The concat() method of the String class accepts a String value, adds it to the current String and returns the concatenated value.
As a consequence, a Java compiler is not required to optimize string concatenation, though all tend to do so as long as no loops are involved. You can check the extent of such compile time optimizations by using javap (the java decompiler included with the JDK).
Since the String object is immutable, each call for concatenation will result in a new String object being created.
it will create two object one in constant pool and one in heap memory.
It generates the equivalent of:
String s = new StringBuilder("abc") .append(methodReturningAString()) .append("ghi") .append(anotherMethodReturningAString()) .append("omn") .append("blablabla") .toString();
It is smart enough to pre-concatenate static strings (i.e. the . You could call the use of "omn" + "blablabla"
)StringBuilder
a "performance trick" if you want. It is definitely better for performance than doing five concatenations resulting in four unnecessary temporary strings. Also, use of StringBuilder was a performance improvement in (I think) Java 5; prior to that, StringBuffer was used.
Edit: as pointed out in the comments, static strings are only pre-concatenated if they are at the beginning of the concatenation. Doing otherwise would break order-of-operations (although in this case I think Sun could justify it). So given this:
String s = "abc" + "def" + foo() + "uvw" + "xyz";
it would be compiled like this:
String s = new StringBuilder("abcdef") .append(foo()) .append("uvw") .append("xyz") .toString();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With