字符串连接期间创建的对象数

Ana*_*and 11 java string object

有人可以告诉我System.out.println在下面的代码中执行语句时将创建多少个对象

int i=0;
int j=1;
System.out.print("i value is "+ i + "j value is "+j);
Run Code Online (Sandbox Code Playgroud)

yat*_*975 7

如果你真的想知道发生了什么,为什么不看字节码呢?

我将你的代码包装在一个main函数中,编译它然后用它反汇编它javap -c Test.class.这是输出(使用Oracle Java 7编译器):

Compiled from "Test.java"
class 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: iconst_0
       1: istore_1
       2: iconst_1
       3: istore_2
       4: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: new           #3                  // class java/lang/StringBuilder
      10: dup
      11: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      14: ldc           #5                  // String i value is
      16: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: iload_1
      20: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      23: ldc           #8                  // String j value is
      25: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      28: iload_2
      29: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      32: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      35: invokevirtual #10                 // Method java/io/PrintStream.print:(Ljava/lang/String;)V
      38: return
}
Run Code Online (Sandbox Code Playgroud)

在此方法中分配的唯一对象是StringBuilder(通过new位置7处的指令).但是,invoked 的其他方法本身可能会分配一些东西,我非常怀疑StringBuilder.toString将分配一个String对象.


Hen*_*nry 5

这将创建一个StringBuilder对象(以及此对象在内部使用的任何对象),添加值,最后StringBuilder将创建一个String带有结果的对象.


Kic*_*ick 1

只是1,字符串对象被连接起来。