先看代码
String a = "a";
String b = "a";
System.out.println(a == b);
System.out.println("---------------------------------");
System.out.println(a.equals(b));
下面我们公布一下结果
好多朋友都知道下面的运行结果是true,如果不知道请参考我的上一篇文章:
下面我们分析一下,为什么a==b的结果也是true
首先需要明白String其实是一个常量类对象,底层代码是final关键字修饰的char数组。
String a=”a”,这句代码在运行时不会在堆内存新建一个String对象,而是会去常量区寻找是否存在“a”这个常量,如果存在,就把“a”这个常量在方法区的地址赋值给栈中的a;如果不存在,那么就在常量区创建“a”常量,然后再把地址赋值给a,所以String a = “a”;
String b = “a”;执行之后,a和b中的值都是“a”在常量区中的地址,所以两者用==或者equals比较时都是true。
再看下面的代码:
String a = "a";
String x = new String("a");
String y = new String("a");
System.out.println(a == x);//结果:false
System.out.println("-----------------------------");
System.out.println(x == y);//结果:false
解释一下,为什么 x==y的结果是false:
String x = new String(“a”);这句代码就不一样了,代码运行时,会在堆中创建新的String对象,对象值为“a”,然后把该对象地址赋值给栈中的x。String x = new String(“a”);String y = new String(“a”);执行之后,堆中就有两个对象,对象值都是“a”,但两个对象的地址不同,且地址分别存放在x和y中,所以x==y会输出false, x.equals(y)会输出true。