0
点赞
收藏
分享

微信扫一扫

String类型比较时,equals和==号的区别:

扬帆远航_df7c 2022-02-11 阅读 108

首先一定要明确 "==" 号的作用,"=="号比较基本类型时,比较的是值,比较引用类型时,比较的是地址。

创建String类型的对象时,需要注意会创建对象的方式不同,创建的对象所在的地址空间可能会不同。

例如:

String str1 = "abc";

String str2 = "abc";

String str3 = new String("abc");

String str4 = new String("abc");

虽然创建的对象看似都"一样"。

但是:

public static void main(String[] args){

System.out.println(str1 == str2); //true

System.out.println(str1 == str3); //false

System.out.println(str3 == str4); //false

System.out.println(str1.equals(str2)); //true

System.out.println(str1.equals(str3)); //true

System.out.println(str3.equals(str4)); //true

}

 

用IDEA编辑器编辑后为什么会有这种结果呢

这是因为直接String str1 = "abc";这样创建String类型的字符串时,它是在字符串常量池中先查找是否有某个地址空间存在"abc"这个String类型的对象,如果没有就创建"abc"这样的对象 ,然后将其所在的地址复制一份交给String类型的变量空间str1中,在申请创建String类型的变量str2时,会优先再次去字符串常量池去查看是否存在某个地址空间存在"abc"这个String类型的对象,因为之前已经创建过了,所以直接将对象"abc"的地址直接复制一份交给str2. 

因为上文已经解释过"=="号比较基本类型时,比较的是值,比较引用类型时,比较的是地址。

而String是引用数据类型,所以比较的是地址。

而str1与str2变量空间中都存储的是字符串常量池字符串对象为"abc"的地址空间,是同一地址,所以str1==str2 结果为true.

而 str1==str3为什么为false呢

这是因为 String str3 = new String("abc"); 这里采用new关键字创建了String类型的对象内value属性数组中存储的是a,b,c这三个字符。

下图是String类中定义的属性  private final char value[];

new关键字一出,说明这里是在堆内存中申请创建的对象空间。所以地址空间肯定不一样。所以说 "=="号比较地址,所以str1 == str3 为false.

 

而str3 ==str4为什么也是false呢

同上理String str4 = new String("abc");也是在堆内存中在申请一个String类型的对象空间且该String类型的对象内value属性数组中存储的也是a,b,c这三个字符。

"=="号比较地址 str3变量内空间存储的地址和str4变量空间中存储的地址不一样,所以也为false.

而String类中的equals方法比较的是String类型的对象的字面值,也即String类型对象的value属性数组中存储的值是否完全相同。

String str1 = "abc";

String str2 = "abc";

String str3 = new String("abc");

String str4 = new String("abc");

而以上所创建的String对象的value属性数组中值都完全相同。

所以才会有以下的三种结果

System.out.println(str1.equals(str2)); //true

System.out.println(str1.equals(str3)); //true

System.out.println(str3.equals(str4)); //true

想仔细研究String类中的equals方法可看下图,或去String类中的976行查看

String类型关于"=="号与equals方法的讲解就到这里结束啦~~~

感谢阅读

 

 

举报

相关推荐

0 条评论