[JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别

文章目录

  • 0、前情
  • 1、相同之处
  • 2、不同之处
  • 3、解释前情

0、前情

[JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别_第1张图片
为什么str1== str2 就返回true,而str1==str3 就返回false?先看内存图解释

[JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别_第2张图片

1、相同之处

String str1=new String(“yhz”)和String str2=“yhz”,都会先去字符串常量池中查看是否已经存在“yhz”,如果存在则直接使用,如果不存在则会在字符串常量池中创建“yhz”。

2、不同之处

String str1 = new String(“yhz”) 还会通过 new String() 在堆里创建并初始化一个value为字符串常量池中"yhz"实例的地址的字符串对象,并将该将对象的地址复制给str1,然后创建一个引用。
[JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别_第3张图片

String str1 = new String(“yhz”) 可能会创建一个或两个对象:
当字符串常量池中已经有 “yhz"时,则会创建一个对象
如果字符串常量池中没有"yhz”,则会创建两个对象:
先在字符串常量池中,创建一个字面量"yhz"所对应的实例。
再通过new String(“yhz”)在堆中创建一个value为字符串常量池中"yhz"实例的地址的字符串对象,并将new出来的地址返回给str1。

String str2 = “yhz”;可能会创建0个或1个对象:
当字符串常量池中,有"yhz"这个实例时,创建0个,直接将"yhz"实例的地址返回给str2
当字符串常量池中,没有"yhz"这个实例时,会在常量池中创建一个"yhz"实例,并将实例的地址返回给str2。

3、解释前情

str1==str2 返回true: 如果字符串常量池中没有"hello",那么当执行String str1=“hello"时,会在字符串常量池中创建一个"hello"实例,并将"hello"实例的地址返回给str1。当执行String str2 = “hello” 时,会去字符串常量池中查看有没有"hello”,由于前面"hello"已经被创建,则将字符串常量池中"hello"实例的地址返回给str2。也就是说str1和str2指向的是同一个内存地址。我们知道,在Java中,= = 运算符比较的是两个变量所指向的对象内存地址是否相同,相同为true,不同则为false。所以str1 == str2 返回 true。

str1==str3 返回 false: 执行到String str3 = new String(“hello”) 时,会先去字符串常量池中看是否有"hello"实例 ,由于之前已经创建了,所以直接去堆中开辟一块空间,创建一个value为字符串常量池中"hello"实例的地址的字符串对象,并将在堆中new出来的对象的地址返回给str3。此时,str1指向字符串常量池中的"hello",str3 指向堆中刚new 出来的对象,由于指向的对象内存地址不同,所以返回false。

[JVM]String str1 = new String(“yhz“)和 String str2 = “yhz“ 的区别_第4张图片

你可能感兴趣的:(jvm,java,开发语言)