public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1==s3.intern());
System.out.println(s3==s4);
}
}
代码执行的结果:
true false true false
出现上面的
结果的解释如下图
任何一个字符串的创建都会扔到常量池中,常量池是方法区的一块存储空间
通过new 创建的对象会放到堆上
== 比较的对对象的内存地址
String 在常量池中存储的数据结构类似一个HashSet ,里面存储的是无序 不重复的字符串,所以两个“abc” 放入到里面存储的是一个
s3 和 s4 是通过new创建的对象,所以放入到堆中,所以两个对象的内存地址不一样。
而 通过 s3.intern() 这个方法,可以将s3从堆内存中放入到常量池中,所以进行比较的时候两个对象的地址是一样的。