【Java基础】String类进行==操作的结果不一样,为什么?

目录

前言

== 比较的是什么?

运行结果

结果分析

注意:

写到最后

四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!

 你的支持认可是我创作的动力

 创作不易,不妨点赞评论❤️收藏一下

 感谢大佬们的支持,欢迎各位前来不吝赐教


前言

String类进行==操作,各个操作结果不一样这是为什么?

在进行String类对比之前先来了解一下== 操作的比较。

== 比较的是什么?

如果==比较的是基本数据类型的话,那么就单纯比较

如果==比较的是引入数据类型的话,那么比较的就是地址值

众所周知,String类型是字符串类型,属于引用数据类型,不属于基本数据类型。所以比较的地址值。那这样说的话,String类型进行==操作的结果不一样,那么就可能是比较的地址值不一样

那么接下来我们来看看String类型进行赋值时的地址情况。

运行结果

我们先来看一组运行结果:

public class String01 {
    public static void main(String[] args) {
       String a = "a";
        String b = "b";
        String ab = "ab";
        String x1 = "a"+"b";
        String x2 = a+b ;
        String x3 = new String("ab");
        //字符串值都是ab
        System.out.println("ab:"+ab);   // ab: ab
        System.out.println("x1:"+ x1);  //x1: ab
        System.out.println("x2:"+ x2);  //x2: ab

        //但是== 比较的结果不一样
        System.out.println(ab == x1);   //true
        System.out.println(ab == x2);   //false
        System.out.println(x1 == x2 );; //false
        System.out.println(x1 == x3);   //false
    }
}

结果分析

结果一:true

在java中使用双引号括起来的都是String对象,使用字面量来创建对象。例如"a"、“b" 、"ab"这表示的是3个String对象。在JDK中把这些用双引号括起来的字符串都是直接存储在“方法区”中的字符串常量池当中的。

对于如果将两个双引号进行+操作,那么在编译时对于这种会进行拼接优化;例如 下面代码:

会被拼接成String x1 = "ab"放入常量池中。

public class test01 {
    public static void main(String[] args) {
        String ab = "ab";
        String x1 = "a"+"b";
        System.out.println(ab == x1);     //结果true
    }
}

内存图:

【Java基础】String类进行==操作的结果不一样,为什么?_第1张图片

根据以上内存图来说,使用字面量来创建对象ab,在常量池寻找是否有相同内容的对象,如果没有,就创建一个对象ab,并且拥有属于一个自己的地址0x1234;因此对象ab的值将指向字符串常量池中字面量ab的地址

第二个对象 x1的值经过优化拼接最终值为“ab”,将会将其放入常量池中,但是这时会发现,池中已经存在了相同的字面量ab,那么在常量池中是不允许出现重复内容的字面量的;所以下x1的值将不会被存放在常量池中,而是直接指向已经存在的字面量ab,因此x1所对应的字面量ab的地址也一样为0x1234。因此ab == x1 结果为true,因为所对应的地址一样。


结果为:false

其实不管是 new String对象还是将两个字符串常量进行+操作都会创建一个新的对象,对象放在堆中,同时也会在常量池中存在该对象的引用值。

public class String01 {
    public static void main(String[] args) {
        String a = "a";
        String b = "b";
        String ab = "ab";
        String x1 = "a"+"b";
        String x2 = a+b ;
        String x3 = new String("ab");
        
        System.out.println(ab == x1);   //true
        System.out.println(ab == x2);   //false
        System.out.println(x1 == x2 );; //false
        System.out.println(x1 == x3);   //false
    }
}

内存图:

【Java基础】String类进行==操作的结果不一样,为什么?_第2张图片

 对于String x2 =  a+b 其实是两个对象进行相加得出的结果,在编译时会进行拼接优化并得出一个新的对象。在运行时会声明一个StringBuilder对象使用append操作对字符串进行拼接,最后toString()得出最终结果。即使得出的值一样但是所对应的内存地址是不一样的。

因此x2对应的对象ab地址为0x5632;x3对应的对象ab地址为0x1346;分别都引用了常量池中的ab。所以进行==比较时,由于String是引用数据类型,所以比较的是地址值,地址值不一样比较都为false。

注意:

所以在进行==比较的时候,要先分清楚比较是基本数据类型还是引用数据类型。因为比较的类型所属不同,所比较的内容也不同。基本数据类型比较的是值,引用数据类型比较的是地址值。


写到最后

四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!

 你的支持认可是我创作的动力

 创作不易,不妨点赞评论❤️收藏一下

 感谢大佬们的支持,欢迎各位前来不吝赐教

你可能感兴趣的:(阶段二:Java基础,java,开发语言,String类型,jvm,常量池)