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”的引用的值吗?
正在回答 回答被采纳积分+1
同学你好,同学可以先了解一下字符串的存储情况:
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 星