Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Java Compiler include String Constant Folding?

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

like image 405
700 Software Avatar asked Dec 20 '11 20:12

700 Software


2 Answers

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.

like image 88
Reverend Gonzo Avatar answered Sep 17 '22 16:09

Reverend Gonzo


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.
like image 31
Martijn Courteaux Avatar answered Sep 20 '22 16:09

Martijn Courteaux