随笔之用字节码的角度解决java基础题

直接甩代码

String s1 = "ab";
String s2 = "a" + "b";
String s3 = "a";
String s4 = "b";
String s5 = s3 + s4;

System.out.println(s1 == s2);
System.out.println(s1 == s5);
System.out.println(s2 == s5);

输出结果

true
false
false

我们将class文件转换成字节码

没有学过字节码指令可能看不懂一些jvm指令,这里的jvm指令很简单,对应的变量s1和s2的赋值过程,关键在于LDC指令,意思是将在范围-2147483648 ~ 2147483647之间的数压入栈中。但是这里出现的是字符串,其实这个跟工具翻译有关,但这不是本次讨论的重点,重点是"ab"  "a" + "b" 在经过编译之后内容一致,此时s1和s2指向常量池中相同的位置,所以s1 = = s2为true

但是为什么后面两个输出为false呢? 我们继续看后面的字节码

虽然我们指令很长,对于新手来说不太友好,但是我们只需要关注重点,变量s5赋值时通过 new StringBuilder对象来构造字符串,所以后面两个输出为了false也很容易理解。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值