String s=new String() 创建了几个对象

73 篇文章 0 订阅

String s=new String("aa");
我们可以看下 字节码信息;
 

第一个箭头,在堆空间创建了一个对象。

第二个箭头在字符串常量池创建了一个对象,所以这里是2个对象;

我们在看下这里创建了几个对象
String s=new String("aa")+new String("bb");

第一个箭头,先把2个变量,在堆中创建了一个aabb对象。

第二个箭头,先在堆中创建了一个aa对象。

第三个箭头,在字符串常量池创建了aa的对象。

第四个箭头,在堆中创建了bb的对象。

第五个箭头,在字符串常量池创建了bb的对象。

这个时候我们发现,并没有在字符串常量池创建aabb的对象,为什么呢?

我们可以看到这一行字节码指令:31 invokevirtual #9 <java/lang/StringBuilder.toString>

我们进入StringBuilder.toString的源码去看下,代码如下

我们翻译下这里的注释:创建一个副本,不要共享数组,我们在看下字节码指令

 可以看到,箭头指向的位置,在堆空间创建了一个对象,并没有在字符串常量去创建。

所以从源码分析的角度来看,一共创建了6个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值