大家好,欢迎来到IT知识分享网。
最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看demo
问题
案例1
可以发现,str == str2的结果为false,那么我们在看看下一个例子。
案例2
这时候,两个字符串对比的结果为true。
探究问题
这时候,疑问就来了,为什么结果会不一致呢?利用在cmd窗口输入 javap-cTestDemo.class命令,对字节码文件进行反编译,发现了问题所在?
可以看到在案例1中,java代码底层走了StringBuilder,进行字符串拼接,然后调用了StringBuilder的toString方法。
而案例2中,对class文件进行反编译,发现代码出现了一点变化,并没有走StringBuilder进行字符串拼接。
总结
- 案例1中,通过变量和字符串拼接,java是需要先到内存找变量对应的值,才能进行完成字符串拼接的工作,这种方式java编译器没法优化,只能走 StringBuilder进行拼接字符串,然后调用toString方法,当然返回的结果和常量池中的 111这个字符串的内存地址是不一样的,因此结果为false。
- 案例2中,直接在表达式里写值,java不用根据变量去内存里找对应的值,可以在编译的时候直接对这个表达式进行优化,优化后的表达式从 “111”+”” 直接变成了 “111” ,两个String类型的变量都指向了常量池的111字符串,因此结果为true;
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48703.html