new String()到底创建了几个对象?看这一篇就够了

经典面试题

String s = new String(“ab”)会创建几个对象?

相信大家肯定都被问到过这个问题,相信大家也都知道答案,对是两个,是哪两个呢? 为什么是两个呢?

哪两个?

1.new关键字在堆空间分配一块空间存放new的对象
2.在常量池中放置"ab"(前提是字符串常量池中不存在"ab")

为什么是两个?(证明)

要想了解为什么最直接的就是字节码,下面我们看一下
new String()到底创建了几个对象?看这一篇就够了_第1张图片
一目了然,第一行一个new关键字创建了一个,第三行ldc是将"ab"放置在字符常量池中,所以是两个。
如果代码写成这样
new String()到底创建了几个对象?看这一篇就够了_第2张图片
再看一下字节码
new String()到底创建了几个对象?看这一篇就够了_第3张图片
此时则是创建了一个对象,也就是new关键字创建的存放在堆空间中.
"ab"字符串是在第一行ldc到字符创常量池中的,所以当new String(“ab”)此时的"ab"就是直接从字符串常量池中直接获取的。

延伸面试题

String str = new String(“a”)+new String(“b”)创建了几个对象?

想知道有多少个最直接的还是看字节码
new String()到底创建了几个对象?看这一篇就够了_第4张图片
1.new了一个StringBuilder对象(ps:当+左右两边有一个是变量则拼接操作底层用的都是StringBuilder的append方法实现)
2.第四行new了一个String对象
3.第六行ldc "a"到字符串常量池中
4.第九行new了一个Stirng对象
5.第十一行ldc "b"到字符创常量池中
到这里大家觉得是几个?很多人会认为是5个,其实不然,我们看下第十四行的字节码,此处是StringBuilder的toString方法。
new String()到底创建了几个对象?看这一篇就够了_第5张图片
源码中是有new了一个String字符串。所以最后的结论是创建了6个对象。

扩展问题
问:此时字符串常量池是否存在字符串"ab"?
答: 从上方的字节码中可以明显看出并没有ldc"ab"所以在字符串常量池中是没有"ab"的

以上如有错误或需要补充的欢迎大佬们留言指正,共同进步,ヾ(◍°∇°◍)ノ゙。

你可能感兴趣的:(String,java,字符串)