之前某公司遇到的一个笔试题…回来了自己折腾了一会

首先结论:String s=”x”+new String(“y”) 这段代码共创建了5个对象

接下来看这句话对应的字节码,JDK版本1.7.8(不同版本可能会有不同结论):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Code:
0: new #2 // class java/lang/StringBuilder
3: dup
4: invokespecial #3 // Method java/lang/StringBuilder."<init>":()V
7: ldc #4 // String x
9: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
12: new #6 // class java/lang/String
15: dup
16: ldc #7 // String y
18: invokespecial #8 // Method java/lang/String."<init>":(Ljava/lang/String;)V
21: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
27: astore_1
28: return Code:
0: new #16 // class java/lang/StringBuilder
3: dup
4: ldc #18 // String a
6: invokespecial #20 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
9: new #23 // class java/lang/String
12: dup
13: ldc #25 // String b
15: invokespecial #27 // Method java/lang/String."<init>":(Ljava/lang/String;)V
18: invokevirtual #28 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #32 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_1
25: return

可以看出 “x”,“y”创建了两个String对象放在字符串常量池

new String(“y”)创建一个String对象放在堆中

在拼接时候,会创建一个StringBuilder对象,放在堆中

之后调用这个StringBuilder对象的append()方法,再调用toString()方法,toString()方法会创建一个String对象,放在堆中

所以共创建了4个String对象,1个StringBuilder对象,共5个对象

如有不同见解欢迎探讨