nongfusanquan 发表于 2020-11-28 15:15

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)正确。】

qihang5518 发表于 2020-11-28 20:49

小白一个,真不太懂这个,如果能在细致点介绍一下就好了

angel8327 发表于 2020-11-29 09:53

怎么感觉和C++一样的做法~

wzh202 发表于 2020-11-30 12:42

如果是String类型的数据拼接的“abc”和原来直接复制的“abc”在内存中是发生了什么呢?

nongfusanquan 发表于 2020-12-15 10:29

qihang5518 发表于 2020-11-28 20:49
小白一个,真不太懂这个,如果能在细致点介绍一下就好了

这个得先了解下jvm内存结构,慢慢来

nongfusanquan 发表于 2020-12-15 10:35

wzh202 发表于 2020-11-30 12:42
如果是String类型的数据拼接的“abc”和原来直接复制的“abc”在内存中是发生了什么呢?

这么理解,常量池中只要有一个“abc”对象(地址为s1),就不会再创建另一个“abc”对象了,其他的用到“abc”对象的,都是使用地址s1

nongfusanquan 发表于 2020-12-15 10:36

angel8327 发表于 2020-11-29 09:53
怎么感觉和C++一样的做法~

C++我是小白,不过很多语言都有共通之处
页: [1]
查看完整版本: java中 “abc”与new String("abc")的区别