关于 String str = new String(" xxx")的疑问

关于 String str = new String(" xxx")的疑问

http://img1.sycdn.imooc.com//climg/5d4be39f000105e210260609.jpg

之前老师说这里老师说 这种情况会产生两个对象,在类加载时会创建一个""对象放到字符串常量池中,
在运行时会从常量池中赋值一份到堆中,并且将堆中这个对象的引用交给str持有. 但是这里视频中
String str3 = new String("imocc");这种情况,并没有创建一个对象放在常量池中,而是直接在栈中
创建一个str3的引用,然后再堆中创建一个对象,并且把str3指向我们所创建的这个对象。


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,这里是因为在老师例子中,已经在常量池中存在“imooc”对象,所以会直接创建str3的引用,不需要在进行创建对象,而在上面的回答中,在常量池中是没有“”对象,所以会在常量池中有一个对象,在堆中有一个对象,一共是两个对象,所以说String str3 = new String("imocc");可能会有1个对象也可能会有两个对象哦~

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • jia_蛙 提问者 #1
    假设有下面两条代码: String str1 = new String("imocc"); String str2= new String("imocc"); 当类加载的时候,会创建一个 "imocc"对象到常量池中,在程序运行到第一段代码 的时候,会在栈中生成一个str引用,然后在堆中创建一个对象,这个对象地值是从 常量池中赋值过来地,然后再让这个str 指向这个堆中地对象。 第一段代码:生成了一个引用 ,创建了两个对象 当程序执行到第二段代码地时候,因为常量池中已经存在 "imooc"这个对象(这个 对象是在类加载地时候创建的),所以只需要在栈中创建 str2引用,然后再堆中 创建对象然后值 从常量池中的“imooc"对象中赋值过来。 str2: 一个引用 ,一个对象. 老师你看看我的理解有没有错误? 如果正确的话,我还想问一下, 如果: String s1 = new String("imooc"); String s2 = new String("IMOOC"); 那么再类加载的时候,它是会一下子把 "imooc"、"IMOOC" 这两个字符串对象加载进 常量池中去吗? 如果是的话,我可不可以理解成,虚拟机会把类中全部需要加载的常量对象在类加载的时候一下在全部加载到常量池中。
    2019-08-08 21:20:37
  • 好帮手慕酷酷 回复 提问者 jia_蛙 #2
    同学你好,你的理解是正确的,但是在类加载时,虚拟机不一定会将对象一次全部加载进去哦~因为在Java虚拟机中规定运行时常量池具有动态性,常量对象可能会动态的进行加载到常量池中哦~ 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-08-09 09:45:08
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师