public class Test { public static void main(String[] args) {
String z = new String("a") + new String("b");//常量池内生成"a" "b",堆中匿名对象a,b,ab,然后对象引用z指向ab对象 String y = z.intern();//常量池内没有"ab",所以匿名对象ab,成为常量"ab",对象引用y指向匿名对象ab也相当于指向常量"ab", System.out.println(z == y);//true System.out.println(y == "ab");//true String g = new String("ab");//堆中创建对象值为ab赋予对象引用g System.out.println(y == g);//对象引用y指向的是常量池中的常量,而g指向的是堆中值为"ab"的对象引用,因此为false String a = "x" + new String("y");//常量池中创建"x","y",堆中创建对象,a引用堆中对象 String c = "x" + "y";//编译器会进行优化相当于c = "xy",上一步编译器不会进行优化 String b = "xy"; System.out.println(a == b);//false System.out.println(b == c);//true }
}