关于下面的代码,为什么结果为true?在我们的想法里,String是一个引用类型,为什么对象可以相等?
package cn.lq.demo;
public class StringDemo {
/**
* @author magic_jh
* @version 1.1.0
*/
public static void main(String[] args) {
String s1="helloworld";
String s2="helloworld";
String s3=new String("helloworld");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
}
}
其实可以看一下内存的分配,就一目了然了。
从图中可以看出其实s1和s2指向的不是堆内存,而是方法区的字符常量池,所以我们知道==比的是地址值,s1,s2指向的是同一个地址,肯定结果为true。我们现在来看s3,s3使用的是构造方法,它就在堆内存开辟了一个空间,其中的”helloworld”还是来自于字符常量池。所以s3指向的是堆内存中的地址,最后与s1比较的是s3指向的地址是堆内存的地址,所以为false。