java常量折叠

今天在看书的时候,看到常量折叠这一术语就很奇怪,查查了上帖子,发现各种语言的大神真的多,有的讲解到底层,作为一个菜鸟,只能拼凑一下简单的思想解答,来应对临时的需求。

常量折叠的概念
常量折叠是一种编译器优化技术。
常量折叠主要指的是编译期常量加减乘除的运算过程会被折叠

常量折叠是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 就不是编译器常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值