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个对象。