Java编译器是否包含字符串常量折叠?

时间:2011-12-20 20:53:12

标签: java string constants compiler-optimization constantfolding

我发现Java supports constant folding of primitive types,但是String s呢?

示例

如果我创建以下源代码

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

编译代码的内容是什么?

合并版? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

或者效率较低的运行时级联版本? 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 个答案:

答案 0 :(得分:14)

这是一个简单的测试:

public static void main(final String[] args) {
    final String a = "1" + "2";
    final String b = "12";        

    System.out.println(a == b);
}

输出:

true

所以,是的,编译器会折叠。

答案 1 :(得分:1)

将使用组合版 编译器会自动对其进行优化并将其放入字符串池中。

您可以通过编写此行轻松证明此行为。

System.out.println("abc" == "a" + ("b" + "c")); // Prints true

这打印为true,表示它是相同的对象。那是因为两件事:

  1. 编译器将"a" + ("b" + "c")优化为"abc"
  2. 编译器将所有字符串文字放在字符串池中。此行为称为String Interning

答案 2 :(得分:-1)

它有效地转化为: out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");