new String(“yupi“) 一共创建了几个对象?

大家好,我是鸭鸭!

此答案节选自鸭鸭最近弄的面试神器面试鸭 ,更多大厂常问面试题,可以点击进行阅读哈!

回归面试题!

会创建 1 或 2 个字符串对象

主要有两种情况:

1、如果字符串常量池中不存在字符串对象“yupi”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。

示例代码(JDK 1.8):

String s = new String("yupi");

对应的字节码:

Snipaste_2024-04-27_22-18-22.jpg

ldc 命令用于判断字符串常量池中是否保存了对应的字符串对象的引用,如果保存了的话直接返回。

如果没有保存的话,会在堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中。

2、如果字符串常量池中已存在字符串对象“yupi”的引用,则只会在堆中创建 1 个字符串对象“yupi”。

示例代码(JDK 1.8):

// 字符串常量池中已存在字符串对象“yupi”的引用
String s1 = "yupi";
// 下面这段代码只会在堆中创建 1 个字符串对象“yupi”
String s2 = new String("yupi");

对应的字节码:

Snipaste_2024-04-27_22-24-12.jpg

这里的过程与上面差不多,我们可以看一下,7 这个位置的 ldc 命令不会在堆中创建新的字符串对象 “yupi”,这是因为 0 这个位置已经执行了一次 ldc 命令,已经在堆中创建过一次字符串对象 “yupi” 了。

7 这个位置执行 ldc 命令会直接返回字符串常量池中字符串对象“yupi”对应的引用。

最后

最后再推荐下鸭鸭目前努力在做**面试神器面试鸭 **,已经有 3000 多道面试题目啦,欢迎大家来阅读!如果大家有不会的面试题,也可以在面试鸭内反馈!鸭鸭会第一时间为大家解答!

我是鸭鸭,我们下期见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值