String a = "a";
final String a1 = "a";
String ab = "ab";
String c = a + "b";
String d = a1 + "b";
System.out.println(c == ab);
System.out.println(d == ab);
运行结果:
false
true
编译器优化是有选择的,其实只要记住一句话就行了:只有编译阶段能确定的值,编译器才可以进行优化。
这里的a可以通过+"b"生成新的String c,a就为可变的,所以c的地址值不等于ab。
但是通过final修饰的a1不可变,编译器知道a1不可改变,所以自然将d
的赋值过程优化,指向静态区ab
的地址.所以输出为true。