请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

看了老师推荐的博客字符串常量池、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”的引用的值吗?

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

1回答

翔仔 2023-08-02 14:42:52

同学好,

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

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

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

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

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

https://img1.sycdn.imooc.com//szimg/64c9faea0974cf9b06970395.jpg


0 回复 有任何疑惑可以回复我~
  • 提问者 weixin_慕哥1459466 #1
    老师好,Java不是只有值传递吗?所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址,我理解的str == "1";是在判断两者的内存地址是否相等,在上面的测试中,我还创建了一个String b = "1"; 然后输出System.out.println(b == "1");结果为true,为什么在public String(String original)方法里original == “1”返回false。
    回复 有任何疑惑可以回复我~ 2023-08-02 15:20:19
  • 翔仔 回复 提问者 weixin_慕哥1459466 #2
    主要是str是地址的地址,"1"是1的地址。。
    回复 有任何疑惑可以回复我~ 2023-08-02 19:59:25
  • 提问者 weixin_慕哥1459466 回复 翔仔 #3
    谢谢老师,这个我理解了,str的地址和“1”的不一样,但我还是奇怪为什么我调用String a = new String("1");后,进到public String(String original)方法里original == “1”的结果是false
    回复 有任何疑惑可以回复我~ 2023-08-02 20:46:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信