public class Main {
public static void main(String[] args) {
String s = new String("1"); //创建两个对象,一个对象是字符串常量池中对象“1”,另一个是new在堆上的对象
s.intern();//由于字符串常量池中有“1”对象,所以此处应返回字符串常量池中的“1”的地址
String s2 = "1";//由于字符串常量池中有“1”对象,故s2指向字符串常量池中的“1”对象
System.out.println(s == s2);//s为new在堆上的对象,s2为字符串常量池中对象,故地址不相等
}
}
由于jdk版本的不同,以下代码运行结果会有不同:
public class Main {
public static void main(String[] args) {
String s3 = new String("1") + new String("1");//该过程要首先创建StringBuilder对象,再在字符串常量池中创建对象“1”,再在堆上创建2个字符串“1”对象,合并后经过toString方法在堆上创建一个新字符串对象“11”
s3.intern();//由于上述过程未在字符串常量池中创建“11“对象,故要在字符串常量池中创建”11“对象;(jdk6中是在字符串常量池中创建”11“对象,jdk7/8后字符串常量池中保存s3的地址)
String s4 = "11";//由于字符串常量池的”11“中保存的是s3地址,故s4与s3地址相同
System.out.println(s3 == s4);//false,jdk6; true,jdk7/8
}