Java编译器用+连接替换StringBuilder

Gau*_*rav 4 java stringbuilder compiler-optimization

这是一些简单的Java代码:

String s = new StringBuilder().append("a").append("b").append("c").toString();
Run Code Online (Sandbox Code Playgroud)

我用JRE 1.6编译它,我在反编译的类文件中观察到以下内容:

String s = "a" + "b" + "c";
Run Code Online (Sandbox Code Playgroud)

根据这个观察我有以下问题:

  1. 为什么编译器会在StringBuilder上选择"+"?
  2. 我们是否有任何正式的Java规范可以证明这种行为是正确的?
  3. 在这种情况下使用StringBuilder是否真的有意义,我们知道编译器会改变它吗?

Oli*_*rth 17

反过来说. +for String是在幕后使用StringBuilder(或StringBuffer)实现的(参见http://docs.oracle.com/javase/7/docs/api/java/lang/String.htmlhttp://docs.oracle.com/javase/ specs/jls/se8/html/jls-15.html#jls-15.18.1).

因此,一旦编译完成,您的两个代码片段就难以区分.反编译器必须猜测原始形式.