其他
字符串拼接,什么时候会走StringBuilder?
最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看demo
一、问题
案例1
案例2
二、探究问题
这时候,疑问就来了,为什么结果会不一致呢?利用在cmd窗口输入javap -c TestDemo.class命令,对字节码文件进行反编译,发现了问题所在?测试代码2cmd.png而案例2中,对class文件进行反编译,发现代码出现了一点变化,并没有走StringBuilder进行字符串拼接。
三、总结
1、案例1中,通过变量和字符串拼接,java是需要先到内存找变量对应的值,才能进行完成字符串拼接的工作,这种方式java编译器没法优化,只能走StringBuilder进行拼接字符串,然后调用toString方法,当然返回的结果和常量池中的111这个字符串的内存地址是不一样的,因此结果为false。2、案例2中,直接在表达式里写值,java不用根据变量去内存里找对应的值,可以在编译的时候直接对这个表达式进行优化,优化后的表达式从 "111" + "" 直接变成了 "111" ,两个String类型的变量都指向了常量池的111字符串,因此结果为true。
最后给大家送下福利,大家可以关注Java核心技术公众号,在后台回复 “福利”可以获取一份我整理的最新Java面试题资料。
(END)
最近好文分享
CTO 写的代码,也是没谁了!手把手教你,Java如何实现二维码?
Java 应用性能调优 so easy。。。
Java中 volatile 关键字的最全总结
终于弄明白 i = i++和 i = ++i 的区别了!
不要在Java代码中写set/get方法了
这21 个 Java 核心技术,要了如指掌
分享史上Java最牛逼,最简短的代码!
更多请扫码关注 • Java核心技术