String a="A";
String b="B";
final String c="C";
final String d="D";
String e=a+b;
String f=a+b;
System.out.println(e==f);//false
String g=c+d;
String h=c+d;
System.out.println(g==h);//true
为什么会这样? String对象是在特殊内存中创建的,称为字符串常量池。但这里最终变量的意义是什么。
答案 0 :(得分:4)
最终关键字会阻止您重新分配变量到不同的String实例。因此,虽然String
本身是不可变的,但除非明确标记为final,否则可以更改引用它的变量。
现在,我对你在这里遇到的确切语义不太确定。但总的来说,由于变量是final,c+d
现在可以被视为编译器常量(它永远不会有"CD"
以外的值。该值在编译时计算,它本身可以是被视为一个常数,被放入实习字符串池中。
答案 1 :(得分:1)
final
表示您将无法在程序中稍后修改此String的值。也:
如果最终变量包含对象的引用,那么状态为 对象可以通过对象的操作来改变,但是 变量总是引用同一个对象。 (source)
答案 2 :(得分:1)
Java编译器发现你已经将变量声明为final
(使它们成为常量而不是变量),在编译时计算c+d
,并将结果内化。
答案 3 :(得分:1)
编译器发现c和d是最终的。这意味着编译器知道c和d永远不会改变。因此它将代码编译为
String g = "CD";
String h = "CD";
因此,g和h是对同一个STring文字的两个引用,它是实习的。
他不能以同样的方式优化e和f,因为a和b不是最终的,因此可以改变。