之前某公司遇到的一个笔试题…回来了自己折腾了一会
首先结论: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个对象
如有不同见解欢迎探讨