jvm对String常量加法的优化

今天一个同事问我一道题目

String a = "ab";
String b = "a" + "b";
System.out.println((a == b));这个的结果是什么?为什么?

String a = "ab";
String str = "b";
String b = "a" + str;
System.out.println((a == b));
这个的结果是什么?为什么?

String a = "ab";
final String str = "b";
String b = "a" + str;
System.out.println((a == b));
这个的结果是什么?为什么?

我一看觉得全都应该是false, 因为string+string会要重新创建对象嘛,这个知道的。
结果在eclipse的运行结果却是:
true
false
true
觉得十分不解, 问同事为何?
回答是:对于第一个,在JAVA代码进行编译时,JAVA编译器已经将String b="a"+"b";优化成String b="ab"; 然后,因为JVM中对字符串的操作是在栈中,所以在运行是,发现栈中已经有了"ab"所以就直接引用。故第一个是TRUE。
-----------------------------------------------------------------------
看来是jvm对常量加法有优化,在编译器能直接得到结果
对于第二个,因为str是变量,所以
String str = "b";
String b = "a" + str;
就不能优化成b="ab";

对于第三个,很明显了, str声明成了final的, 又变成了常量
所以又能简化成b="ab"了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值