字符串拼接,什么时候会走StringBuilder?

点击上方“程序员知识码头”,选择“关注公众号

技术文章第一时间送达!


640?wx_fmt=jpeg

作者:叫我不矜持

www.jianshu.com/p/a80c9b2b89cd

前言

最近在突然想到了 String 字符串拼接问题,于是做了一个 demo 测试了一下,到底 String 类型的字符串在拼接的时候,哪种情况下会走会走 StringBulider 进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看 demo

一. 问题

案例 1

640?wx_fmt=png

测试代码 1.png

可以发现,str == str2 的结果为 false,那么我们在看看下一个例子。

案例 2

640?wx_fmt=png

测试代码 2.png

这时候,两个字符串对比的结果为 true。

二. 探究问题

这时候,疑问就来了,为什么结果会不一致呢?*利用在 cmd 窗口输入 javap -c TestDemo.class 命令,对字节码文件进行反编译,发现了问题所在?*

640?wx_fmt=png

测试代码 1cmd.png

可以看到在案例 1 中,java 代码底层走了 StringBuilder,进行字符串拼接,然后调用了 StringBuilder 的 toString 方法。

640?wx_fmt=png

测试代码 2cmd.png

而案例 2 中,对 class 文件进行反编译,发现代码出现了一点变化,并没有走 StringBuilder 进行字符串拼接。

三. 总结

1、案例 1 中,通过变量和字符串拼接,java 是需要先到内存找变量对应的值,才能进行完成字符串拼接的工作,这种方式 java 编译器没法优化,只能走 StringBuilder 进行拼接字符串,然后调用 toString 方法,当然返回的结果和常量池中的 111 这个字符串的内存地址是不一样的,因此结果为 false。

2、案例 2 中,直接在表达式里写值,java 不用根据变量去内存里找对应的值,可以在编译的时候直接对这个表达式进行优化,优化后的表达式从 "111" + ""直接变成了"111" ,两个 String 类型的变量都指向了常量池的 111 字符串,因此结果为 true;



结语


就以这段话自勉、共勉吧。越努力、越幸运,如果你不是官二代、富二代、红二代,那么请记住:勤奋才是改变你命运的唯一捷径。

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。


欢迎各位读者加入程序员知识码头技术群,在公众号后台回复“加群”即可。

640?wx_fmt=png


猜你还想看


                               

扫描方“二维码”,选择“关注公众号

每天技术文章第一时间送达!

640?wx_fmt=png

扫描关注回复‘资料’
免费领取100T价值8889元的学习资料
支持大宇,留个在看吧640?

猜你喜欢

转载自blog.csdn.net/weixin_45579804/article/details/102694110