得到String 对象的方式有两种, 一种是使用通过构造方法的方式, 一种是直接赋值的方式.
他们的特点如下:
s3, s4 本质上是同一个对象.
内存分析:
首先程序从main 方法开始执行, main 方法加载到栈内存中.
然后再堆内存中创建一个字符数组.这块内存空间的地址值是001, 并把001赋值给chs.
chs 通过001 就指向了001这块内存地址.
接下来创建第一个字符串对象.
String s1 的内容就会再main 方法中出现.
new String 的内容就会再堆内存中出现.
new 完之后, 他会有一个地址叫002.
这里的参数是字符数组, 所以参考的内容也是字符数组, 而字符数组的内存地址是001, 所以它参考的值来自于001这块内存地址值.
最后把002 这个内存地址赋值给s1, s1 通过002 就指向了堆内存002这块空间.
这行代码同理.
s2 构造方法的参数也是参照字符数组, 所以堆内存中右边的方框也是参照001这块内存空间的内容.
接下来s1 和s2 的地址进行比较, s1 的地址值是002, s3 的内存地址值是003.所以再控制台输出的是false.
接下来, String s3 首先会出现在main 方法中, "abc" 这个内容会出现在常量池里面.
"abc " 也有一个地址叫004.
然后把地址值004 赋值给s3, s3就通过004指向了 常量池的这块空间.
String s4 = "abc" 同理, "abc" 的地址值也是004.
s3 和 s4 的地址值相同, 所以输出的是True.
s1 和 s3 的地址值不相同, 所以输出的是false.
main 方法结束, 从栈内存中消失.