大家好,我是鸭鸭!
此答案节选自鸭鸭最近弄的面试神器面试鸭 ,更多大厂常问面试题,可以点击进行阅读哈!
回归面试题!
会创建 1 或 2 个字符串对象。
主要有两种情况:
1、如果字符串常量池中不存在字符串对象“yupi”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。
示例代码(JDK 1.8):
String s = new String("yupi");
对应的字节码:
ldc
命令用于判断字符串常量池中是否保存了对应的字符串对象的引用,如果保存了的话直接返回。
如果没有保存的话,会在堆中创建对应的字符串对象并将该字符串对象的引用保存到字符串常量池中。
2、如果字符串常量池中已存在字符串对象“yupi”的引用,则只会在堆中创建 1 个字符串对象“yupi”。
示例代码(JDK 1.8):
// 字符串常量池中已存在字符串对象“yupi”的引用
String s1 = "yupi";
// 下面这段代码只会在堆中创建 1 个字符串对象“yupi”
String s2 = new String("yupi");
对应的字节码:
这里的过程与上面差不多,我们可以看一下,7 这个位置的 ldc
命令不会在堆中创建新的字符串对象 “yupi”,这是因为 0 这个位置已经执行了一次 ldc
命令,已经在堆中创建过一次字符串对象 “yupi” 了。
7 这个位置执行 ldc 命令会直接返回字符串常量池中字符串对象“yupi”对应的引用。
最后
最后再推荐下鸭鸭目前努力在做**面试神器面试鸭 **,已经有 3000 多道面试题目啦,欢迎大家来阅读!如果大家有不会的面试题,也可以在面试鸭内反馈!鸭鸭会第一时间为大家解答!
我是鸭鸭,我们下期见~