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。
文章讨论了Java中字符串的编译器优化,指出final关键字如何影响字符串的内存分配。在例子中,由于a可以动态与b拼接成ab,所以变量c的内存地址不同于预创建的字符串常量ab。然而,final修饰的a1不可变,因此d的赋值被优化直接指向ab在字符串常量池的地址,导致了不同的比较结果。
859






