String类中new String(String original)方法的入参

String类中new String(String original)方法的入参

看了老师推荐的博客字符串常量池、class常量池和运行时常量池   https://blog.csdn.net/qq_26222859/article/details/73135660

https://img1.sycdn.imooc.com//climg/64c8af7a09d0d6b319820370.jpg

有了如下理解,String a = new String("1")会在类加载时,在Heap上创建“1”,并将其引用驻留在全局字符串常量池中,后续调用执行的String类中new String(String original)方法的入参就是常量池中该引用,为了验证此观点,我写了如下代码,并在String类源码的public String(String original)方法上加入断点,并尝试比较original和“1”,如下

https://img1.sycdn.imooc.com//climg/64c8af9909f87efd20180630.jpg

https://img1.sycdn.imooc.com//climg/64c8af9909ac88ea13860810.jpg

我不太理解为什么传进来的original和“1”不相等?他们不应该都等于全局字符串常量池中保留的“1”的引用的值吗?


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

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

1回答
好帮手慕小尤 2023-08-01 15:37:20

同学你好,同学可以先了解一下字符串的存储情况:

    1、直接使用字面值的方式,例如:String s = "1"的形式。此时字符串只存储在内存中的方法区的常量池中。而常量池是被整个Java虚拟机共享的,任何访问这个字符串的引用都在访问同一个字符串。

    所以这种创建字符串对象的步骤只有一步:

    在常量池中获取字面值为“1”的引用,将地址值赋值给引用变量s。

    2、使用new语句的形式创建字符串,例如:String s = new String("1")的形式。不同于上面的做法,这里的步骤是:

        1)在堆内存空间中创建一个类型为String的对象

        2)在常量池中获取字面值为“1”的引用,赋值给上一步的对象

        3)将堆内存中对象的地址值赋值给引用变量s

    由于堆内存中的对象是相互独立的,所以每次使用new语句创建String对象,虽然内部的内容一致,但是其引用变量中存储的地址都是不同的。

    综上,即使内容相同的字符串,如果在创建时使用的new语句,那么使用“==”是无法获得“true”的结果的。可以使用“equals”方法来判断字符串的内容是否一致。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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