前言
== 比较的是什么?
运行结果
结果分析
注意:
写到最后
四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!
你的支持认可是我创作的动力
创作不易,不妨点赞评论❤️收藏一下
感谢大佬们的支持,欢迎各位前来不吝赐教
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
}
}
内存图:
根据以上内存图来说,使用字面量来创建对象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
}
}
内存图:
对于String x2 = a+b 其实是两个对象进行相加得出的结果,在编译时会进行拼接优化并得出一个新的对象。在运行时会声明一个StringBuilder对象使用append操作对字符串进行拼接,最后toString()得出最终结果。即使得出的值一样但是所对应的内存地址是不一样的。
因此x2对应的对象ab地址为0x5632;x3对应的对象ab地址为0x1346;分别都引用了常量池中的ab。所以进行==比较时,由于String是引用数据类型,所以比较的是地址值,地址值不一样比较都为false。
注意:
所以在进行==比较的时候,要先分清楚比较是基本数据类型还是引用数据类型。因为比较的类型所属不同,所比较的内容也不同。基本数据类型比较的是值,引用数据类型比较的是地址值。
四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!
你的支持认可是我创作的动力
创作不易,不妨点赞评论❤️收藏一下
感谢大佬们的支持,欢迎各位前来不吝赐教