java中 “abc”与new String("abc")的区别
【不定期分享java知识点,从javase到springcloud,欢迎交流】String s1 = “abc” 做了什么?
1. 在栈中创建了一个名为 s1 的变量(引用)
2. 如果 String池中没有“abc”存在,则在常量池中创建一个 String 类型的“abc”对象,有就不创建
3. 将“abc”的地址赋给s1
所以,此句到底创建了几个对象,根据“abc”的情况而定,“abc”之前存在就是一个,否则就没有创建。
String s2 = new String(“abc”) 做了什么?
1. 创建了一个名为 s2 的变量(引用)
2. 如果 String池中没有“abc”存在,则在 String池中创建一个 String类型的“abc”,有就不创建
3. 使用new关键字在堆中创建了一个String对象,将用new创建的String 对象的地址赋给s2,即s2是实例化对象在堆中的地址
【故再次new,String池中不改变,栈区多s3变量,堆区多新的对象并把地址赋给s3,故s2==s3错误,s2.equals(s3)正确。】
小白一个,真不太懂这个,如果能在细致点介绍一下就好了 怎么感觉和C++一样的做法~ 如果是String类型的数据拼接的“abc”和原来直接复制的“abc”在内存中是发生了什么呢? qihang5518 发表于 2020-11-28 20:49
小白一个,真不太懂这个,如果能在细致点介绍一下就好了
这个得先了解下jvm内存结构,慢慢来 wzh202 发表于 2020-11-30 12:42
如果是String类型的数据拼接的“abc”和原来直接复制的“abc”在内存中是发生了什么呢?
这么理解,常量池中只要有一个“abc”对象(地址为s1),就不会再创建另一个“abc”对象了,其他的用到“abc”对象的,都是使用地址s1 angel8327 发表于 2020-11-29 09:53
怎么感觉和C++一样的做法~
C++我是小白,不过很多语言都有共通之处
页:
[1]