
关于String a=hello和String b=hello时a==b返回true的解析
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
本篇文章详细解释了Java中当两个字符串内容相同且直接用双引号定义时,使用“==”比较运算符为何会返回true的原因及原理。
在Java语言里存在一个常量池的概念:当创建String类型的引用变量并赋予值的时候,JVM会检查该字符串是否已经存在于常量池中。如果存在,则直接返回指向这个已存在的对象的地址给当前变量;否则会在内存中的堆区为新的字符串分配空间,并将指针赋给新定义的引用类型变量。
比如:
```java
String a=hello world;
```
这里,由于hello world是第一次出现,所以会创建一个新的String对象并放入常量池中。之后再声明`String b = hello world`时,JVM发现这个字符串已经存在于常量池里了,则直接返回之前存在的那个对象的地址给b。
而使用new关键字则不同:
```java
String c=new String(hello world);
```
上述语句会在堆内存中创建一个新的hello world对象,并将该新分配空间的位置(即指针)赋值给c变量。因此,即使两个引用指向的是相同的字符串内容,在Java里它们也可能因为地址的不同而不相等。
通过实验:
```java
String a=hello world;
String b=hello world;
if(a==b) System.out.println(a==b);
else System.out.println(a!=b);
String c=new String(hello world);
String d=new String(hello world);
if(c==d) System.out.println(c==d);
else System.out.println(c!=d);
```
结果会输出:`a==b`,因为它们都指向了常量池中的同一个对象;而 `c!=d` 则是因为使用new关键字创建的两个字符串虽然内容一样但位于不同的内存地址。
如果需要比较这两个新生成的对象的内容是否相同,则可以使用:
```java
if(c.equals(d)) System.out.println(c==d);
else System.out.println(c!=d);
```
这样就可以正确地判断出它们是相等的,输出结果为 `c==d`。
全部评论 (0)


