常量折叠是Java在编译期做的一个优化,简单的来说,在编译期就把一些表达式计算好,不需要在运行时进行计算。
其中Java语言规范15.28规定了Java的常量表达式可以表示原始类型或者字符串;它们不但可以由纯粹的字面量构成,还可以包含能在编译时确定结果的运算,包括+、-、~、!、*、/、%、<<、>>、>>>、<、>、<=、>=、==、!=、&、|、^、&&、||、? :,还有指向上述类型的常量(final变量)的表达式。
编译器会为常量分配了地址,但是在使用常量的时候,常量会被一立即数替换(保护常量,防止被破坏性修改)
比如: int a = 1 + 2
,经过常量折叠后就变成了int a = 3
。
我们举个例子:
public class Main {
public static void main(String[] args) {
String s1 = "a" + "bc";
String s2 = "ab" + "c";
System.out.println(s1 == s2);
}
}