new String("ab")到底创建了几个对象说明

new String("ab")到底创建了几个对象?

之前一直被这个问题困扰,网上一些描述的都不是很清楚,自己看了一些资料可算搞清楚了,那就在博客上记录一下吧!

String str = new String("ab");

答案是2个

第一个是在堆中开辟了一块空间,存放String对象。

第二个是在字符串常量池中放入了一个"ab"

可通过其字节码证明。

字节码解释如下:

 0 new #2 <java/lang/String>
这一步在heap中创建了一个String类型的对象。

 3 dup
复制栈顶的值

 4 ldc #3 <ab>
将这个值"ab" push到常量池中

 6 invokespecial #4 <java/lang/String.<init>>
调用实例方法init

 9 astore_1
将引用存储到本地变量表的1索引处

10 return

那么再探讨下new String("a") + new String("b")创建了几个对象?

String str = new String("a") + new String("b");

查看code字节码

由字节码可以看出,可以说有5个对象,分别是:

1、new StringBuilder()

2、堆中的new String("a")

3、常量池中的对象"a"

4、堆中的new String("b")

5、常量池中的对象"b"
    
6、StringBuilder的toString方法中的new String("ab")
   StringBuilder的toString方法中调用了new String()。但并未在常量池中生成"ab",由下图toString方法的字节码可以看出。

看toString的字节码,只有一个对象。

posted @ 2021-01-22 17:02  墨影笑倾城  阅读(947)  评论(0)    收藏  举报
Live2d Test Env