String对象诞生的故事,值得你来发现

关于这个问题

https://www.zhihu.com/question/23394906

这个链接里的乔学士说的挺好的。

我自己的一些看法如下:

【以下是小人的一些拙见,还望大家能给与指点,先谢过了】

问题:产生的新对象有几个??


String str=“Hello”;------①

对于①,此时的str是作为一个String类型对象的引用。“str”这个引用是存在于栈中的。而“Hello”字符串是存在于jvm内存分区中的方法区里。

再细分一点就是在该方法区中的运行时常量池中。它在编译完成时就在运行时常量池中诞生了。

在①情况下的产生的新对象就只有一个。就是在

常量池中蹦出来的那个“Hello”。

String str2=new String("Hello");------②

同样的,这里的str2也是作为一个String类型对象的引用。"str2“作为引用存储在栈中。【new String("Hello")】这么一大块儿是在jvm内存中的堆区中新开辟了一个空间。

无论常量池中是否有“Hello”这个字符串,这个空间都会避开无遗!而这个开辟的新空间中,相当于一个房子,里面是不能空的,当然要住人。此刻在之中住的人就是"Hello"

君了。此情况下产生的新对象的个数要分两种情况来考虑。

第一种就是在常量池中已经有了"Hello"这个字符串,此时新出来的对象就只是会在堆内存去中蹦出来(说是蹦,其实就是常量池中的对应对象"Hello"复制过来的)。这里就只有"Hello"君一个人。产生的新对象就是1个。

第二种情况:常量池中并没有“Hello”这个字符串对象。开辟空间仍会继续。这时与上一种情况不同的地方就是这个房子被建好后是允许暂时空着的。此时会先在常量池中生成一个新的“Hello”字符串对象("Hello"君如出水芙蓉般在常量池中冉冉升起。。跑题了- -),然后会被拷贝一份,直接给放到刚才建好的房子里,就是那个新开辟的空间头!-

---》这个拷贝的动作是谁执行的呢??我认为是Jvm虚拟机干的。而且第一种情况下,新开辟空间中的"Hello“也是拷贝过去的,而不是重新去诞生的。(理由就是:有原材料不用,简直没得道理。而且这个原材料并不会对拷贝出的新对象有任何的影响。)

在②的情况下产生的新对象就是2个。常量池中出水芙蓉的那个"Hello",以及急不可耐分身也要住进新房子的"Hello".

【非常感谢您能看到这里,欢迎您的评论】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值