I found out that Java supports constant folding of primitive types, but what about String
s?
Example
If I create the following source code
out.write(""
+ "<markup>"
+ "<nested>"
+ "Easier to read if it is split into multiple lines"
+ "</nested>"
+ "</markup>"
+ "");
What goes into the compiled code?
Combined Version? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");
Or the less efficient run-time concatenation version? out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));
Here's an easy test:
public static void main(final String[] args) {
final String a = "1" + "2";
final String b = "12";
System.out.println(a == b);
}
Output:
true
So, yes, the compiler will fold.
The combined version will be used.
The compiler optimises this automatically and puts it in the String Pool.
You can prove this behaviour easily by writing this line.
System.out.println("abc" == "a" + ("b" + "c")); // Prints true
That this prints true, means that it are the same objects. That is because of two things:
- The compiler optimised
"a" + ("b" + "c")
to"abc"
. - The compiler puts all string literals in the string pool. This behaviour is called String Interning.
It effectively translates to:
out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");
来源:https://stackoverflow.com/questions/8581824/does-java-compiler-include-string-constant-folding