先来看一段代码,再来谈我们的话题
public class Test{
public static void main(String[] args){
String a="a";
final String b="a";
String c="a"+"b";
String d=a+"b";
String e=b+"b";
String f="ab";
System.out.println(c==f);
System.out.println(d==f);
System.out.println(e==f);
}
}
这一串代码的结果是
true
false
true
下面来一个个的解释
第一个:
像c这样的直接两个字符串字面量相加,编译器在编译时就会直接把它变成c="ab",这样c==f自然就是true了
第二个:
因为a是一个变量,编译器并不会进行优化,因为编译器无法确定a是否会有其他的变化,所以比较地址就是false了。
第三个:
因为被final修饰了,所以编译器知道它不会再改变了,实际相当于第一个一样。
其实只要仔细去想,很容易就能够想通,能提前做的事情,JVM就已经帮我们做了。