测试代码如下:
1 public static void main(String[] args) throws Exception { 2 String s1 = new String("abc"); 3 String s2 = "abc"; 4 String s3 = new String("abc"); 5 System.out.println(s1 == s2);// false 6 System.out.println(s1 == s3);// false 7 System.out.println(s2 == s3);// false 8 }
上述代码执行后,在常量池中生成了一个对象,在堆中生成了两个对象(指向常量池中的对象)。
s1先在堆中创建了一个对象,然后在常量池中寻找字符串,没有找到则在常量池中创建一个对象,堆中保存常量池中对象的引用。
s2先在常量池中寻找字符串,找到了则返回常量池中对象的引用。
s3先在堆中创建了一个对象,然后在常量池中寻找字符串,找到了则返回常量池中对象的引用,堆中保存常量池中对象的引用。
测试代码如下:
1 public static void main(String[] args) throws Exception { 2 String s1 = "java"; 3 String s2 = "ja"; 4 String s3 = "va"; 5 System.out.println(s1 == "java");// true 6 System.out.println(s1 == (s2 + s3));// false 7 System.out.println(s1 == "ja" + s3);// false 8 System.out.println((s2 + s3) == (s2 + s3));// false 9 }
上述代码执行后,在常量池中生成了三个对象,在堆中生成了四个对象(指向常量池中的对象)。
s1先在常量池中寻找字符串,没有找到则在常量池中创建一个对象,返回常量池中对象的引用。
s2先在常量池中寻找字符串,没有找到则在常量池中创建一个对象,返回常量池中对象的引用。
s3先在常量池中寻找字符串,没有找到则在常量池中创建一个对象,返回常量池中对象的引用。
字符串在拼接时,先在堆中创建了一个对象,然后在常量池中寻找字符串,找到了则返回常量池中对象的引用,堆中保存常量池中对象的引用。