Does Java Compiler include String Constant Folding?

1.1k Views Asked by At

I found out that Java supports constant folding of primitive types, but what about Strings?

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(""));

3

There are 3 best solutions below

0
Reverend Gonzo On BEST ANSWER

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.

0
user1071777 On

It effectively translates to: out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

1
Martijn Courteaux On

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:

  1. The compiler optimised "a" + ("b" + "c") to "abc".
  2. The compiler puts all string literals in the string pool. This behaviour is called String Interning.