今天在看书的时候,看到常量折叠这一术语就很奇怪,查查了上帖子,发现各种语言的大神真的多,有的讲解到底层,作为一个菜鸟,只能拼凑一下简单的思想解答,来应对临时的需求。
常量折叠的概念
常量折叠是一种编译器优化技术。
常量折叠主要指的是编译期常量加减乘除的运算过程会被折叠
常量折叠是Java在编译期做的一个优化,简单的来说,在编译期就把一些表达式计算好,不需要在运行时进行计算。
比如: int a = 1 + 2,经过常量折叠后就变成了int a = 3。
这是其中比较能说明final的例子(非常容易疏忽)
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
结果:
true
false
常量折叠发生的条件
必须是编译期常量之间进行运算才会进行常量折叠。
编译期常量就是“编译的时候就可以确定其值的常量”,
首先:字面量是编译期常量。(数字字面量,字符串字面量等)
其次:编译期常量进行简单运算的结果也是编译期常量,如1+2,“a”+“b”。
最后:被编译器常量赋值的 final 的基本类型和字符串变量也是编译期常量。
最后放一些大家的例子
public class demo {
public static void main(String args[]){
String hello="你好";
String testOne="你"+"好";
System.out.println(hello == testOne);
System.out.println("你好" == testOne);
System.out.println("你好" == hello);
String you="你";
String hi="好";
String testTwo=you+hi;
System.out.println(hello == testTwo);
String testThree =you+hi;
System.out.println(testTwo == testThree);
}
}
结果
true
true
true
false
false
同时要再看一下这个例子,小心混淆
public static void main(String[] args) {
String x ="a";
final String a = x;
final String bc = "bc";
String s1 = "a" + "bc";
String s2 = a + bc;
System.out.println(s1 == s2);
}
结果是false
这里需要注意的是:final的变量,不是被编译期常量初始化的也不是编译器常量
这里的a 就不是编译器常量