关于new String()内存模型问题

关于new String()内存模型问题

老师您好,

例如 String str1 = new String("imooc");
    String str2 = new String("imooc");

相关截图:

https://img1.sycdn.imooc.com//climg/637478a108da049209001600.jpg


问题:老师我看你课程中两个new String("imooc") 直接就是在堆区间开辟一个空间然后存imooc 了,这个应该不对吧,正确的应该是在堆区间保存的是常量池中保存imooc字符串所开辟空间的内存地址,然后在栈区间引用的是堆区间所开辟的空间地址,有点像c语言中二级指针的概念,麻烦老师看下我上面所画的图,是不是我理解错了?

正在回答 回答被采纳积分+1

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

1回答
好帮手慕小蓝 2022-11-16 14:38:15

同学你好~

1.课程中描述的重点是“使用new和不使用new”的对象存储空间不同,所以没有细致的追究构造方法中参数值的来源问题。

2.同学所画的图大体是正确的,但是有个细节需要纠正。两个堆空间中的对象,并不是简单的引用了常量池中的对象地址,而是引用了常量池中对象的内容。对于String类型对象来说,不仅仅是有字面值“imooc”,还包括了对象头等信息。所以实际上引用的只是字面值,而不是完整的对象地址。

祝学习愉快~

  • 提问者 慕无忌4072121 #1

    老师那使用new 和不使用new 的对象空间区别是,当不使用new 时,栈区对象引用的是常量池的字面值,而使用new 时则会在堆区开辟一个空间并被栈区对象引用,而堆区对象引用的是常量池的字面值,我的理解对吗

    2022-11-16 14:57:53
  • 好帮手慕小蓝 回复 提问者 慕无忌4072121 #2

    同学你好,当不使用new关键字时,栈空间引用的是常量池中的对象而不是字面值。其他描述都是正确的。

    祝学习愉快~

    2022-11-16 15:41:53
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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