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)
如果你真的想知道发生了什么,为什么不看字节码呢?
我将你的代码包装在一个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对象.