工作10年后,再看String s = new String("xyz") 创建了几个对象?
这个问题相信每个学习java的工作同学都不陌生,作为一个经典的年后面试题,到现在工作这么多年了我真是对象认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的工作人,其中不乏工作很多年的年后人都有争论,我认为还是对象有必要来说一说这个问题的。
从方法区说起
常量池存在于方法区,工作而方法区在jdk1.7版本前后改变比较大,年后所以还是对象先来说说方法区的演变。
在jdk1.7版本之前,工作常量池存在于方法区,年后方法区是对象堆的一个逻辑部分,他有一个名字叫做非堆。工作

1.7版本把字符串常量池放到了堆中。年后

而在1.8以后,对象则是移除了永久代,方法区概念保留,方法区的实现改为了元空间,常量池还是在堆中。云南idc服务商

为什么要说方法区的改变,只是为了文章接下来的内容不会由于JDK的版本而产生分歧,接下来内容都会以jdk1.8版本作为基础来讨论。
String s = new String("xyz");
先来一段代码
public class Test { public static void main(String[] args) { String s = "xyz"; } }接着我们javac编译代码,然后用javap来反编译,执行javap -c Test

从结果来看,ldc命令在常量池中创建了一个"xyz"的对象,然后把他推至操作数栈顶,然后astore保存到局部变量,return返回。
接着看第二段面试题中的代码
public class Test { public static void main(String[] args) { String s = new String("xyz"); } }同样反编译分析

很明显,我们看到new 创建了一个String对象,同时ldc在常量池中创建了"xyz"字符串对象,之后invokespecial执行构造函数,astore_1赋值,return返回。
通过以上两个例子,可以知道String s = new String("xyz"); 创建了2个对象,而有些答案说的3个对象,则是把引用s也算作一个对象。
还有答案说xyz存在就创建了2个,不存在就创建了3个(包含引用s),再来测试一下。
public class Test { public static void main(String[] args) { String s = "xyz"; String s2 = new String("xyz"); } }
从这里,很明显的源码下载发现这就是我们例子1和2的一个结合,但是注意两次ldc后面的#2,#号代表着索引,说明第二次new String("xyz")的时候并没有重新创建xyz对象。
一些常见的指令助记符含义:
nop, 什么都不做。 aconst_null,将 null 推送至栈顶。 iconst_i(变量数字),将 int 型 i 推送至栈顶。同理有lconst_0,fconst_0这种你应该知道什么意思了 ldc,将 int,float 或 String 型常量值从常量池中推送至栈顶。 iload,将指定的 int 型局部变量推送至栈顶。 istore,将栈顶 int 型数值存入指定局部变量。同理astore_i代表将栈顶引用型数值存入第i个局部变量。 dup,复制栈顶数值并将复制值压入栈顶。 invokevirtual,调用实例方法。 invokespecial,调用超类构造方法,实例初始化方法,免费源码下载私有方法。 invokestatic,调用静态方法。 invokeinterface,调用接口方法。 invokedynamic,调用动态链接方法。 new,创建一个对象,并将其引用值压入栈顶。总结
到底创建了几个对象呢?
如果xyz不存在,引用算对象的话,那就是3个 如果xyz不存在,引用不算对象的话,那就是2个 如果xyz存在,引用算对象的话,那就是2个 如果xyz存在,引用不算对象的话,那就是1个当然,我认为引用肯定是不算对象的,最终答案应该是1或者2个,这个面试题说实话不应该出现在初级面试题里。
相关文章
探索AM09的性能和特点(高效运行与智能控制——AM09的引人注目之处)
摘要:AM09是一款由著名家电品牌Dyson推出的高性能空气处理设备。它以其出色的性能和智能控制而备受关注。本文将对AM09的功能和特点进行详细介绍,以帮助读者更好地了解这款先进的家电产...2025-11-05
MSU2020年度世界视频编码大赛 金山云斩获UGC赛道冠军
近日,莫斯科国立大学(Moscow State University)举办的世界视频编码器大赛传来好消息,金山云自主研发的KAV1编码器在UGC赛道中拔得头筹。MSU视频编码大赛是全球盛宴,在视频编码2025-11-05
科技进步日新月异,IT电子产品得到了长足发展。显示技术从2D到3D,再到如今的虚拟现实,每一个时代都催生出相应的新科技产品,VR眼镜就是当下最流行的产品。随着技术的提升,成本的下降,如今VR眼镜价格越2025-11-05
业务场景 #某公司有个借贷的项目,具体业务类似于阿里的蚂蚁借呗,用户在平台上借款,然后规定一个到期时间,在该时间内用户需将借款还清并收取一定的手续费,如果规定时间逾期未还上,则会产生滞纳金。用户发起借2025-11-05
前言毫无疑问,现在是短视频、直播的时代。视频内容逐渐代替图文形式成为网友们获取新鲜事物以及展现自我的一大媒介。随着5G的到来,2020年属于直播短视频爆发式增长的一年,电商平台也都涌入直播营销的大风口2025-11-05

最新评论