关于字符串拼接的一个问题?

package test;

public class Test {
    public static void main(String[] args) {
        // 下面这行是不是用 StringBuilder 构造的字符串
        String str = "This is " + new Java();
        System.out.println(str);
    }
}
class Java {
    @Override
    public String toString() {
        return "Java";
    }
}

我虽然看不懂字节码,但是我在字节码里找不到 StringBuilder 这个类,那么上面的代码,那个字符串拼接是由谁完成的呢?

字节码文件:

Compiled from "Test.java"
public class test.Test {
  public test.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class test/Java
       3: dup
       4: invokespecial #3                  // Method test/Java."<init>":()V
       7: invokedynamic #4,  0              // InvokeDynamic #0:makeConcatWithConstants:(Ltest/Java;)Ljava/lang/String;
      12: astore_1
      13: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
      16: aload_1
      17: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      20: return
}
阅读 1.8k
1 个回答

jdk9+?
jdk9以后变成了InvokeDynamic #0:makeConcatWithConstants

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题