堆 直接存放于堆中,或者 存在于常量池中。
==比较的是内存地址 equals 比较的是值
示例1
String x = "hello";String y = "hello";System.out.println(x == y); //trueSystem.out.println(x.equals(y)); //true
String x = “hello”; 在堆的常量池中生成一个hello对象, x指向 它
String y = “hello”; 常量池中已经存在hello对象, y直接指向它
示例2
char[] ch={'a','b','c'};String s1= new String(ch);String s2="abc";System.out.println(s1==s2); //false
new String 生成的abc 直接在堆中申请一块内存空间进行存放
String s2=“abc”; 在常量池中生成abc
所以 s1 和s2 内存地址是不一样的
示例3
char[] ch={‘a’,‘b’,‘c’};
String s1=new String(ch);
s1.intern();
String s2=“abc”;
System.out.println(s1==s2); //true
new String 生成的abc 直接在堆中申请一块内存空间进行存放
s1.intern(); 调用intren方法,会将该内存复制到常量池中,内存地址一致
String s2=“abc” 直接指向复制的内存地址