5

我发现Java支持原始类型的常量折叠,但是Strings呢?

例子

如果我创建以下源代码

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

4

3 回答 3

16

这是一个简单的测试:

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

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

输出:

true

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

于 2011-12-20T20:54:55.783 回答
2

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

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

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

这打印为真,意味着它是相同的objects。那是因为两件事:

  1. 编译器优化"a" + ("b" + "c")"abc".
  2. 编译器将所有字符串文字放入字符串池中。这种行为称为String Interning
于 2011-12-20T20:55:16.337 回答
-1

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

于 2011-12-20T20:54:52.500 回答