关于String类中new String(String original)的问题

来源:10-1 Java异常体系

weixin_慕哥1459466

2023-08-01

看了老师推荐的博客字符串常量池、class常量池和运行时常量池 https://blog.csdn.net/qq_26222859/article/details/73135660
图片描述
有了如下理解,String a = new String(“1”)会在类加载时,在Heap上创建“1”,并将其引用驻留在全局字符串常量池中,后续调用执行的String类中new String(String original)方法的入参就是常量池中该引用,为了验证此观点,我写了如下代码,并在String类源码的public String(String original)方法上加入断点,并尝试比较original和“1”,如下
图片描述
图片描述
我不太理解为什么传进来的original和“1”不相等?他们不应该都等于全局字符串常量池中保留的“1”的引用的值吗?

写回答

1回答

翔仔

2023-08-02

同学好,

对于jvm底层,String str = new String("1")创建对象流程是什么?

  1. 在常量池中查找是否存在"1"这个字符串;若有,则返回对应的引用实例;若无,则创建对应的实例对象;

  2. 在堆中new一个String类型的"1"字符串对象;

  3. 将对象地址复制给str,然后创建一个应用。

所以str持有的是对象地址,而"1"则直接是对象,不是一个东西

https://img.mukewang.com/szimg/64c9faea0974cf9b06970395.jpg


0
4
翔仔
回复
weixin_慕哥1459466
同学好,不是呢 我意思是str是堆里面的地址 直接赋值1是字符串常量池的地址 两个地址不一样 所以是false
2023-08-02
共4条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程